如何正确显示日语RTF字体

Rya*_*yan 5 delphi unicode fonts rtf

我正在研究Delphi 2009中的一个应用程序,该应用程序大量使用RTF,使用TRichEdit和TLMDRichEdit进行编辑.在这些RTF控件中输入日文文本的用户一直在提交关于日文文本在重新加载内容时显示为乱码的间歇性报告,在Win XP和Vista上都安装了东部语言支持.

通常情况下,英语和日语混合在一起,大多数时候都没有问题,例如:

Inventory turns partnerships.  ??????
Run Code Online (Sandbox Code Playgroud)

(如果日语文本被错误地打破,我很抱歉 - 我不会说或读这种语言).

然而,很多时候,只有文本的日文部分才是胡言乱语,例如:

ŒÉñ?“]-¦Œüã‚Ì·•ʉ?-vˆö‚ðŽû‰v‚ÉŒø‰?“I‚ÉŒ‹‚т‚¯‚é’mޝ‚ª‘÷Ý‚·‚é?(??????????
??????  ?????????????)
Run Code Online (Sandbox Code Playgroud)

从广泛的在线搜索看,问题是由于字体保存为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
Run Code Online (Sandbox Code Playgroud)

但是,仍然存在相当多的"垃圾"字符,这些字符未被正确识别为日文字符.查看原始RTF,您将看到以下内容:

-D\'82\'82\u65405?\'83I\'83y\'83\'8c[\'83V\'83\u12539?\ldblquote\'82\u65414?
Run Code Online (Sandbox Code Playgroud)

显然,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显示转换为大多数读者可以处理的方法,但我还没有找到解决方案,例如:参见 此处此处.

fro*_*ogb 1

我的猜测是,更改 RTF 中的字体名称可能会让事情变得更糟。如果 RTF 中指定的字体不是 Unicode 字体,那么以该字体呈现的字符肯定会被编码为 Shift-JIS,而不是 Unicode。然后文本中的其他角色也会如此。因此,将整个内容视为 Unicode,或附加 Unicode 文本,将导致您看到的损坏。您需要确定导入的 RTF 编码是 Shift-JIS 还是 Unicode,以及您运行的计算机(因此 D2009 默认输入格式)是否是日语。在日本,如果文本文件没有 Unicode BOM,则通常是 Shift-JIS(但并非总是如此)。