Я использую Google Chrome Native Messaging, который сообщает, что он поддерживает кодировку USON в кодировке UTF8. Находится здесь.
Я почти уверен, что мой код довольно стандартный и в значительной степени является копией ответов здесь, в C #. Например, см. Этот вопрос SO.
Private Function OpenStandardStreamIn() As String
Dim MsgLength As Integer = 0
Dim InputData As String = ""
Dim LenBytes As Byte() = New Byte(3) {} 'first 4 bytes are length
Dim StdIn As System.IO.Stream = Console.OpenStandardInput() 'open the stream
StdIn.Read(LenBytes, 0, 4) 'length
MsgLength = System.BitConverter.ToInt32(LenBytes, 0) 'convert length to Int
Dim Buffer As Char() = New Char(MsgLength - 1) {} 'create Char array for remaining bytes
Using Reader As System.IO.StreamReader = New System.IO.StreamReader(StdIn) 'Using to auto dispose of stream reader
While Reader.Peek() >= 0 'while the next byte is not Null
Reader.Read(Buffer, 0, Buffer.Length) 'add to the buffer
End While
End Using
InputData = New String(Buffer) 'convert buffer to string
Return InputData
End Function
Проблема, с которой я столкнулся, заключается в том, что когда JSON включает такие символы, как ß Ü Ö, тогда вся строка кажется разнородной, и я не могудесериализовать это.Это читабельно, и мой журнал показывает, что строка в порядке, но есть что-то другое.Пока строка НЕ содержит эти символы, десериализация работает нормально.Я не предоставляю код JavascriptSerializer, так как это не проблема.
Я пытался создать StreamReader с различными кодировками, такими как
New System.IO.StreamReader(StdIn, Encoding.GetEncoding("iso-8859-1"), True)
, однако ß Ä и т. Д. В этом случае не верны.
Чего я не понимаю, так это если строка UTF8 и .NET использует UTF16, как мне убедиться, что преобразование выполнено правильно?
ОБНОВЛЕНИЕ
Проводил тестирование.Я обнаружил, что если я получаю строку с fuß, тогда длина сообщения (предоставляемая собственным обменом сообщениями) равна 4, но число Char в буфере равно 3, если строка равна fus, тогда длина сообщения равна 3, а количество символов равно3. Почему это так?
При использовании приведенного выше кода объект Buffer 1 слишком велик, и поэтому возникает проблема.Если я просто использую метод Read в потоке, то он работает нормально.Похоже, что Google Messaging отправляет сообщение длиной, отличной от ß в строке.
Если я хочу использовать приведенный выше код, то как узнать, что длина сообщения неверна?