Можно ли как-то определить, какая спецификация была предоставлена и в каком количестве байтов?
Если ваш файл (или поток, что угодно) имеет кодировку UTF-16, спецификация всегда будет 2 байта: либо FE FF
, либо FF FE
.
Так что, если вам действительно нужно знать спецификацию (если ваш файл с прямым или прямым порядком байтов), просто прочитайте первые два байта вашего файла (или потока):
Dim data as Byte()
Using fs = File.OpenRead("path/to/file/test.txt")
Using binaryReader = new BinaryReader(fs)
data = binaryReader.ReadBytes(2)
End Using
End Using
Если ваш файл содержит спецификацию, data
теперь будет содержать либо FE FF
, либо FF FE
.
Но вы также сказали, что уже знаете, что у вас файл с прямым порядком байтов UTF-16, поэтому мне не ясно, чего вы на самом деле пытаетесь достичь.
Когда вы читаете файл / поток в строку, строка не будет содержать спецификацию, так как это не имеет смысла: спецификация не является частью реального содержимого, это просто маркер, указывающий на то, как интерпретировать куча байтов.
Также обратите внимание, что не каждый символ в строке UTF-16 представлен двумя 8-битными байтами: символ также может быть представлен 4 байтами.
Если вы хотите содержимое в виде строки, просто используйте StreamReader(Content, Text.Encoding.Unicode)
.
Для вашего примера
String.Substring(1, 3)
должен произвести "AAa"
либо просто вычтите 1
из индекса (String.Substring(0, 3)
), либо просто добавьте в строку фиктивный 16-битный символ (Dim sContent = "x" + oContent.ReadToEnd
).
Обновление: чтобы получить кодировку файла / потока, пусть StreamReader
сделает всю работу за вас:
Dim encoding as Encoding
using sr = new StreamReader(filename, true)
sr.peek()
encoding = sr.CurrentEncoding
end using
encoding.BodyName
сейчас, например, utf-16BE
.