Как я могу сделать преобразование между байтами и Unicode в Dart? - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь реализовать ответ Irn в Как работать с типами символов в Dart? (Печать по алфавиту) Но не совсем понял, как это сделать.

Пример В моем коде Dart İ заглавная i с точкой выше представляет собой байт [304] и я должен заменить это на сервер байт [152] и отправить на сервер в виде байта, а не строки.

Test-1:

cpToLatin9(int cp) => const {0x11e: 0xd0, 0x11f: 0xf0, 0x130: 0xdd, 0x131: 0xfd, 0x15e: 0xde, 0x15f: 0xfe}[cp] ?? cp;
latin9ToCp(int latin9Char) => const {0xd0: 0x11e, 0xf0: 0x11f, 0xdd: 0x130, 0xfd: 0x131, 0xde: 0x15e, 0xfe: 0x15f}[latin9Char] ?? latin9Char;


String iso08859_9 = "çÇğĞıİşŞöÖüÜ";
List<int> bytes = utf8.encode(iso08859_9);

 for (var i = 0; i < bytes.length; i++) {
    int byte = bytes[i];
    var latin9ToCodePoint = latin9ToCp(byte);
    print("latin9ToCodePoint: $latin9ToCodePoint");

    var latin9ToCodePointChar = String.fromCharCode(latin9ToCodePoint);
    print("latin9ToCodePointChar: $latin9ToCodePointChar");
  }

Выход:

iso08859_9 bytes: [195, 167, 195, 135, 196, 159, 196, 158, 196, 177, 196, 176, 197, 159, 197, 158, 195, 182, 195, 150, 195, 188, 195, 156]
latin9ToCodePoint: 195
latin9ToCodePointChar: Ã
latin9ToCodePoint: 167
latin9ToCodePointChar: §
latin9ToCodePoint: 195
latin9ToCodePointChar: Ã
latin9ToCodePoint: 135
latin9ToCodePointChar: 
latin9ToCodePoint: 196
latin9ToCodePointChar: Ä
latin9ToCodePoint: 159
latin9ToCodePointChar: 
latin9ToCodePoint: 196
latin9ToCodePointChar: Ä
latin9ToCodePoint: 158
latin9ToCodePointChar: 
latin9ToCodePoint: 196
latin9ToCodePointChar: Ä
latin9ToCodePoint: 177
latin9ToCodePointChar: ±
latin9ToCodePoint: 196
latin9ToCodePointChar: Ä
latin9ToCodePoint: 176
latin9ToCodePointChar: °
latin9ToCodePoint: 197
latin9ToCodePointChar: Å
latin9ToCodePoint: 159
latin9ToCodePointChar: 
latin9ToCodePoint: 197
latin9ToCodePointChar: Å
latin9ToCodePoint: 158
latin9ToCodePointChar: 
latin9ToCodePoint: 195
latin9ToCodePointChar: Ã
latin9ToCodePoint: 182
latin9ToCodePointChar: ¶
latin9ToCodePoint: 195
latin9ToCodePointChar: Ã
latin9ToCodePoint: 150
latin9ToCodePointChar: 
latin9ToCodePoint: 195
latin9ToCodePointChar: Ã
latin9ToCodePoint: 188
latin9ToCodePointChar: ¼
latin9ToCodePoint: 195
latin9ToCodePointChar: Ã
latin9ToCodePoint: 156
latin9ToCodePointChar: 

Test-2: Если я изменю Список байтов = utf8.encode (iso08859_9); на

Список байтов = iso08859_9.codeUnits; Я получаю другой результат.

В моем Dart я проверяю, что символ iso08859_9 представлен как iso08859_9 байт:

[231, 199, 287, 286, 305, 304, 351, 350, 246, 214, 252, 220]

Теперь моя основная проблема - изменить байты на IBM CP байтов на

[135, 128, 167, 166, 141, 152, 159, 158, 148, 153, 129, 154]

Когда я делаю это и использую socket.add (ibmcp_bytes) для сервера, персонаж не читается.

Обновление:

попробуйте это и выясните 1 и 2 байта в результате. ??? * +1057 *

print("ç".runes.length);
print(utf8.encode("ç").length);
...