Qt:QString 中的 Unicodes / Utf-8 需要永远(12 分钟)才能在控制器上显示
Qt: Unicodes / Utf-8 in QString takes for ever (12 minutes) to display on a controller
我正在 Eclipse/Linux 中使用 Qt 开发多语言应用程序。在泰语中,换行符在我的控制器上似乎没有得到很好的支持(我仍然不确定为什么)。无论如何,以下算法会在每个泰文字符 之间插入一个零宽度 space (\u200b)(字符与其重音符号之间除外),因此可能会出现换行符。但是,我的控制器现在 需要 12 分钟才能以泰语启动 (在显示打开 QString 消息之前的 12 分钟)。该函数覆盖了 Qt 中的 QTranslator::translate,因此我可以在每个已翻译的 QString 中添加零宽度 space。
我的问题如下:你们能告诉我我是否正确操作了 QString 中的 Unicode 和 Utf-8 字符吗?编辑:泰国符号的呈现是 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;
}
在泰语中,spaces 用于段落之间而不是单词之间;这就是你原来的问题中换行不好的原因。
要正确解决这个问题,您应该使用一种算法来找到单词之间的边界;例如 libthai;并在那里插入中断,而不是在辅音之间任意插入。
在每个辅音之间插入一个 space 可能是速度慢的原因之一。
与此同时,您使用的范围是错误的:您不应该在前面的元音之后换行。此代码段应该为您清除它:
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
}
我正在 Eclipse/Linux 中使用 Qt 开发多语言应用程序。在泰语中,换行符在我的控制器上似乎没有得到很好的支持(我仍然不确定为什么)。无论如何,以下算法会在每个泰文字符 之间插入一个零宽度 space (\u200b)(字符与其重音符号之间除外),因此可能会出现换行符。但是,我的控制器现在 需要 12 分钟才能以泰语启动 (在显示打开 QString 消息之前的 12 分钟)。该函数覆盖了 Qt 中的 QTranslator::translate,因此我可以在每个已翻译的 QString 中添加零宽度 space。
我的问题如下:你们能告诉我我是否正确操作了 QString 中的 Unicode 和 Utf-8 字符吗?编辑:泰国符号的呈现是 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;
}
在泰语中,spaces 用于段落之间而不是单词之间;这就是你原来的问题中换行不好的原因。
要正确解决这个问题,您应该使用一种算法来找到单词之间的边界;例如 libthai;并在那里插入中断,而不是在辅音之间任意插入。
在每个辅音之间插入一个 space 可能是速度慢的原因之一。
与此同时,您使用的范围是错误的:您不应该在前面的元音之后换行。此代码段应该为您清除它:
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
}