Qt: Unicodes / Utf-8 в QString занимает вечно (12 минут) для отображения на контроллере

Я делаю многоязычное приложение с Qt, в Eclipse/Linux. На тайском языке разрывы строк не очень хорошо поддерживаются на моем контроллере (я до сих пор не знаю, почему). В любом случае, следующий алгоритм вставляет пробел нулевой ширины (\u200b) между каждым тайским символом (кроме символа и его ударений), так что может произойти разрыв строки. Тем не менее, мой контроллер теперь загружается на тайском языке в течение 12 минут (за 12 минут до отображения открывающего сообщения QString). Функция переопределяет QTranslator::translate из Qt, поэтому я могу добавить пробелы нулевой ширины в каждой переведенной QString.

Мой вопрос заключается в следующем: Можете ли вы, ребята, сказать мне, правильно ли я манипулирую символами Unicode & Utf-8 в QString? Изменить: Является ли рендеринг тайских символов проблемой Qt? Большое спасибо!

QString EditTranslation::translate(const char *context, const char *sourceText, const char *disambiguation) const{


QString translatedString = QTranslator::translate(context,  sourceText,  disambiguation);

if (SystemSettingsService->getLanguageType() != ISystemSettingsService::Thai )
    return translatedString;

// Important block starts here********************* 

QString translatedStringModified;

for(QString::const_iterator i(translatedString.begin()); i != translatedString.end(); ++i){

   translatedStringModified.append(i->unicode());

   int unicode = (i+1)->unicode();

   if(((unicode > 3584 && unicode < 3634 && unicode != 3633) || (unicode > 3646 && unicode < 3655) || (unicode > 3662 && unicode < 3676))){

           translatedStringModified.append(QString::fromUtf8("\u200b")); // Zero-width space is added
   }

}

// ************************************

return translatedStringModified;
}

1 ответ

Решение

В тайском языке пробелы используются между словами, а не словами; это причина того, что разрыв строки плох в вашей первоначальной проблеме.

Чтобы решить это правильно, вы должны использовать алгоритм, чтобы найти границы между словами; такие как в libthai; и вставьте разрывы там вместо произвольной вставки между согласными.

Вставка пробела между каждым согласным, вероятно, является одной из причин медлительности.

В то же время, диапазоны, которые вы используете, неверны: вы не должны нарушать после предыдущего гласного. Этот фрагмент кода должен прояснить его для вас:

int current = i->unicode();
int next = (i+1)->unicode();

if( (((next >= 0xE31) && (next <= 0xE34)) || ((next >= 0xE47) && (next <= 0xE4E))) || ((current >= 0xE40) && (current <= 0xE46)) )
{
  // Don't insert space
}
else
{
  // Insert space
}
Другие вопросы по тегам