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
}