我正在使用Delphi 2009开发一款应用程序,其中大量使用RTF进行编辑,使用TRichEdit和TLMDRichEdit。在这些RTF控件中输入日语的用户提交了间歇性报告,称重新加载内容时日语文本显示为乱码,无论是在安装了东亚语言支持的Win XP和Vista上都有此问题。
通常情况下,英语和日语混合显示,大部分情况下没有问题,例如:
Inventory turns partnerships. 在庫回転率の
如果我把日语文字打乱了,对此我很抱歉——我不会说也不会读这种语言。
然而经常情况下,只有日语部分的文本会变成无意义的字符,例如:
ŒÉñ?“]-¦Œüã‚Ì·•Ê‰?-vˆö‚ðŽû‰v‚ÉŒø‰?“I‚ÉŒ‹‚т‚¯‚é’mŽ¯‚ª‘÷Ý‚·‚é?(マーケットセクター、
見込み客の優 先順位と彼らに販売する知識)
通过广泛的在线搜索,似乎问题是由RTF中保存的字体引起的。在日语版Windows中存在的字体不一定与美国英语版相同。可以通过编程方式替换RTF文件中的字体,从而得到几乎可接受的结果。
-D‚‚スƒIƒyƒŒ[ƒVƒ・“‚ニƒƒWƒXƒeƒBƒbƒN‚フƒpƒtƒH[ƒ}ƒ“ƒX‚-˜‰v‚ノŒ‹‚ム‚ツ‚ッ‚ネ‚「‚±ニ‚ヘ?A‘‚「‚ノ-ウ‘ハ‚ナ‚ ‚驕B‚サ‚‚ヘAl“セ‚オ‚ス・‘P‚フˆロ‚ƒƒXƒN‚ノ‚ウ‚‚キB
然而,仍然有相当多的“垃圾”字符未被正确识别为日语字符。查看原始的RTF文本,你会看到以下内容:
-D\'82\'82\u65405?\'83I\'83y\'83\'8c[\'83V\'83\u12539?\ldblquote\'82\u65414?
显然,Unicode字符被正确地呈现,但例如\'82\'82这一对字符应该是其他的东西吗?我猜它实际上代表某种双字节字符,由于某种神秘的原因,它被编码为两个单独的字符而不是一个Unicode字符。
是否有一种通用的(相对)万无一失的方法来处理包含东方语言的RTF,并可靠地再次显示它?
为了完整起见,我按以下方式更新了RTF字体表:
- 将字体名称"?l?r ?o?S?V?b?N;"替换为"\'82\'6c\'82\'72 \'82\'6f\'83\'53\'83\'56\'83\'62\'83\'4e;"
- 通过将"\froman\fprq1\fcharset0 "替换为"\fnil\fprq1\fcharset128 "更新字体名称
- 通过将"\froman\fprq1\fcharset238 "替换为"\fnil\fprq1\fcharset128 "更新字体名称
- 通过将"\froman\fprq1 "替换为"\fnil\fprq1\fcharset128 "更新字体名称
- 将字体名称"?? ?????;"替换为"\'82\'6c\'82\'72 \'82\'6f\'83\'53\'83\'56\'83\'62\'83\'4e;"
更新:仅更新字体名称不会有任何区别。区域设置似乎是一个大问题。我看到了一些讨论如何将日语RTF的显示转换为大多数读者可以处理的内容的网站,但我还没有找到解决方案,例如:这里和这里。