UTF8->UTF16 и обратно
- Войдите на сайт для отправки комментариев
Всем привет.
1 . Я пытаюсь читать файл *.txt (кодировка UTF8) с sd карточки в строку и преобразовать ее в UTF16(UCS2). Есть идеи как это сделать? Возможно ли это? Гуглил несколько дней и что только не пытался сделать, но не получается))) Язык в файле русский и английский.
Я нашел несколько методов из C/C++, например: iconv , MultiByteToChar , mbstowcs , swprintf, с помощью методов типа wstring , но ардуина ни в какую не хочет понимать их... Возможно ли импортировать библиотеку iconv или какую-нибудь другую для того, чтобы выполнить преобразование? Девайс: Arduino Mega2560
2 . Какие библиотеки, методы , типы доступны в Arduino IDE , но не документированы в референсе на arduino.cc? Я нашел только референсы на wiring и processing, но там ничего нужного не нашел(может плохо искал?). Я видел много типов и методов , которые отсутствуют в референсе на arduino.cc, wiring, processing... Почему?
3 . Кто-нибудь работал с HaikuVM? Что вы можете сказать об этом? Попытался сделать с ним что-нибудь, но он не компилит демо проект и вылетает с ошибками...
4 . Я буду благодарен за, пояснения/ссылки, как преобразовать с помощью бинарных операций, но в приоритете я хочу найти более простой способ))
5. Возможно ли импортировать c/c++ библиотеки? На каком языке они должны быть написаны, чтобы ардуина приняла их?
Понимаю, что очень много вопросов, но, пожалуйста не шлите в гугл/яндекс, а ответьте хотя бы ссылками
Когда я сталкнулся с тем что в Arduino это сложно...
Вот тут совсем ничего не понятно : https://github.com/nehalem9001/utf8toutf16
Но учитывая http://www.fileformat.info/info/charset/UTF-16/list.htm таблицу - чтобы перекодировать UTF-8 в UTF-16 обычные таблицы достаточно добавить 2 байта("\xfe\xff") через каждые 2 байта начиная с начала. Чтобы обратно - UTF-16 в UTF-8 - убрать эти байты "\xfe\xff", повторяющиеся через 2 байта.
Вроде все просто.
Когда я сталкнулся с тем что в Arduino это сложно...
Вот тут совсем ничего не понятно : https://github.com/nehalem9001/utf8toutf16
Но учитывая http://www.fileformat.info/info/charset/UTF-16/list.htm таблицу - чтобы перекодировать UTF-8 в UTF-16 обычные таблицы достаточно добавить 2 байта("\xfe\xff") через каждые 2 байта начиная с начала. Чтобы обратно - UTF-16 в UTF-8 - убрать эти байты "\xfe\xff", повторяющиеся через 2 байта.
Вроде все просто.
Огромное спасибо!!! Буду пробовать! Как будут результаты, отпишусь. Что-нибудь по поводу других вопросов есть?
Когда я сталкнулся с тем что в Arduino это сложно...
Вот тут совсем ничего не понятно : https://github.com/nehalem9001/utf8toutf16
Но учитывая http://www.fileformat.info/info/charset/UTF-16/list.htm таблицу - чтобы перекодировать UTF-8 в UTF-16 обычные таблицы достаточно добавить 2 байта("\xfe\xff") через каждые 2 байта начиная с начала. Чтобы обратно - UTF-16 в UTF-8 - убрать эти байты "\xfe\xff", повторяющиеся через 2 байта.
Вроде все просто.
Огромное спасибо!!! Буду пробовать! Как будут результаты, отпишусь. Что-нибудь по поводу других вопросов есть?
#include <SPI.h> #include <SD.h> File conf_file; byte gt; void setup() { Serial.begin(19200); char buf; String unic = ""; String conf = ""; pinMode(53, OUTPUT); if (!SD.begin(4)) { Serial.println("SD_init_FAILED"); return; } Serial.println("SD_init_OK"); conf_file = SD.open("test.txt"); if (conf_file) { Serial.println("file_open_OK"); while (conf_file.available()) { buf = conf_file.read(); conf += buf; } Serial.println(conf); conf_file.close(); } else { Serial.println("file_open_FAILED"); } unsigned intunic; for (int i = 0; i<conf.length(); i++) { Serial.println((utf8_to_unicode((conf[i])))); } } void loop() { } static int flagL = 0; unsigned utf8_to_unicode(unsigned utf8) { unsigned unicode = 0; if (utf8 <= 0x7F) { unicode = utf8; } else if (utf8 > 0x7F && utf8 <= 0xDFBF) { unicode = ((utf8 & 0x1f00) >> 2) | (utf8 & 0x3F); if (unicode <= 0x7F) { flagL = 1; } } else if (utf8 > 0xDFBF && utf8 <= 0xEFBFBF) { unicode = ((utf8 & 0xF3F00) >> 2) | (utf8 & 0x3F); unicode = ((unicode & 0x3C000) >> 2) | (unicode & 0xFFF); if (unicode <= 0xDFBF) { flagL = 1; } } else if (utf8 > 0xEFBFBF && utf8 <= 0xF7BFBFBF) { unicode = ((utf8 & 0x73F3F00) >> 2) | (utf8 & 0x3F); unicode = ((unicode & 0x1CfC000) >> 2) | (unicode & 0xFFF); unicode = ((unicode & 0x700000) >> 2) | (unicode & 0x3FFFF); if (unicode <= 0xEFBFBF) { flagL = 1; } } return unicode; }