2009-05-01 66 views
5

我工作的德尔福2009年,这使得RTF的大量使用的应用程序,使用TRichEdit和TLMDRichEdit编辑。谁进入这些RTF控件日本文字用户已经提交有关日本的文本间歇报告重装安装的内容,无论是在Win XP和Vista,与东方语言支持时显示为乱码。如何正确地显示日本RTF字体

通常,英语和日语的混合没有问题大多显示,例如:

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■解读V B n的;???????”用 “\ '82 \ '6C \ '82 \ '72 \ '82 \' 1207 \ '83 \ '53 \ '83 \ '56 \ '83 \ '62 \ '83 \'4E;”
  • 通过更换更新的字体名称 “\弗罗曼\ fprq1 \ fcharset0” 与 “\ fnil \ fprq1 \ fcharset128”
  • 更新的字体替换名 “\弗罗曼\ fprq1 \ fcharset238” 与 “\ fnil \ fprq1 \ fcharset128”
  • 将“\ froman \ fprq1”替换为“\ fnil \ fprq1 \ fcharset128”更新的字体名称
  • 替换字体名称“?? ?????;”用 “\ '82 \ '6C \ '82 \ '72 \ '82 \' 1207 \ '83 \ '53 \ '83 \ '56 \ '83 \ '62 \ '83 \'4E;”

更新:更新单独的字体名称不会有所作为。现场似乎是一个大问题。我看到了几个网站讨论围绕日本RTF的显示转换的东西大多数读者会处理的方式,但我还没有找到一个解决办法,例如参见: herehere

+0

如果涉及多个RTF库,则从/到RTF的不同转换是潜在的原因。如果RTF编写器发出读者不理解的代码,那么一切都是可能的。 – mjn 2017-06-02 18:48:16

+0

当在Windows 10上用写字板打开时,字体名称'82l''82r''82o''83S''83V''83b''83N显示为'MS PGothic'。用LibreOffice打开或用写字板Win 7,它显示为“MS Pゴシック”。 – mjn 2017-06-02 18:52:43

+0

请注意,字体名称?l?r?o?S?V?b?N;在你的提问中似乎已经是腐败了,我想在文件的前一个状态中它是'82''82''83''83''83b''83 N. – mjn 2017-06-02 18:53:58

回答

1

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

1

我看到类似的东西,但没有与日文字体。只有特殊字符如微(如微升)和上标。问题是即使我从ASP.NET网页发送给用户的RTF字符串是正确的(我可以看到使用Fiddler2编码的RTF流),但是当MS Word实际打开RTF时,它添加了一堆垃圾转义代码就像我在你的示例中看到的一样。

我所做的就是通过转换例程来运行整个RTF文本,该例程将ascii 127上的所有字符换成其特殊的unicode点等价物。所以我会得到像\ uc1 \ u181这样的东西? (微)为特殊字符。当我这样做时,Word能够打开文件没有问题。讽刺的是,它重新编码了\ uc1 \ uxxx?回到他们的RTF转义等价物。

Private Function ConvertRtfToUnicode(ByVal value As String) As String 

    Dim ch As Char() = value.ToCharArray() 
    Dim c As Char 
    Dim sb As New System.Text.StringBuilder() 
    Dim code As Integer 

    For i As Integer = 0 To ch.Length - 1 
     c = ch(i) 
     code = Microsoft.VisualBasic.AscW(c) 
     If code <= 127 Then 
      'Don't need to replace if one of your typical ASCII codes 
      sb.Append(c) 
     Else 
      'MR: Basic idea came from here http://www.eggheadcafe.com/conversation.aspx?messageid=33935981&threadid=33935972 
      ' swaps the character for it's Unicode decimal code point equivalent 
      sb.Append(String.Format("\uc1\u{0:d}?", code)) 
     End If 
    Next 

    Return sb.ToString() 

End Function 

不知道这是否会帮助你的问题,但它对我有用。