UTF8->UTF16 и обратно

beginer
Offline
Зарегистрирован: 12.02.2014

Всем привет.

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++ библиотеки? На каком языке они должны быть написаны, чтобы ардуина приняла их?

Понимаю, что очень много вопросов, но, пожалуйста не шлите в гугл/яндекс, а ответьте хотя бы ссылками

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Когда я сталкнулся с тем что в 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 байта.

Вроде все просто.

beginer
Offline
Зарегистрирован: 12.02.2014

NeiroN пишет:

Когда я сталкнулся с тем что в 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 байта.

Вроде все просто.

Огромное спасибо!!! Буду пробовать! Как будут результаты, отпишусь. Что-нибудь по поводу других вопросов есть?

beginer
Offline
Зарегистрирован: 12.02.2014

beginer пишет:

NeiroN пишет:

Когда я сталкнулся с тем что в 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 байта.

Вроде все просто.

Огромное спасибо!!! Буду пробовать! Как будут результаты, отпишусь. Что-нибудь по поводу других вопросов есть?

К сожалению, нужно именно в такой кодировке читать... По ссылке алгоритм конвертирует букву П в код 4048, что соответствует иероглифу. 
Делаю так(правильно?):
#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;
}