El Sanchez

Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: local s = string.char(0xE0) far.Show (win.Utf8ToUtf16(s)) | shmuz, Utf8ToUtf16 ожидает, что на входе у неё будут байты UTF-8. Байт 0xE0 ну никак не корректный. Windows возвращает замещающий символ, поэтому не ругается. Код: Проверяем, правильные ли байты после string.char: C:>lua:far.Show(string.byte(string.char(0xE0),1)) 1| 224 ; 224 = 0xE0 OK Проверяем, правильные ли байты после string.char: 0xD0, 0xB0 - это правильная последовательность байтов символа маленькой кириллической буквы а в кодировке UTF-8. C:>lua:far.Show(string.byte(string.char(0xD0, 0xB0),1,2)) 1| 208 ; 208 = 0xD0 2| 176 ; 176 = 0xB0 OK Проверяем, правильные ли байты после win.Utf8ToUtf16: C:>lua:far.Show(string.byte(win.Utf8ToUtf16(string.char(0xE0)),1,2,3,4)) 1| 253 ; 253 = 0xFD 2| 255 ; 255 = 0xFF 0xFDFF - замещающий символ (кодовая точка U+FFFD) в кодировке UTF-16LE, поэтому не ругается в Windows. Замещающий потому, что 0xE0 это фуфло. Проверяем, правильные ли байты после win.Utf8ToUtf16 для корректных байтов: C:>lua:far.Show(string.byte(win.Utf8ToUtf16(string.char(0xD0, 0xB0)),1,2,3,4)) 1| 48 ; 48 = 0x30 2| 4 ; 4 = 0x04 0x3004 - кириллическая маленькая буква а (кодовая точка U+0430) в кодировке UTF-16LE. | |