Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何正确显示日文RTF字体_Delphi_Unicode_Fonts_Rtf - Fatal编程技术网

Delphi 如何正确显示日文RTF字体

Delphi 如何正确显示日文RTF字体,delphi,unicode,fonts,rtf,Delphi,Unicode,Fonts,Rtf,我正在Delphi2009中开发一个应用程序,它大量使用RTF,使用TRichEdit和TLMDRichEdit进行编辑。在这些RTF控件中输入日文文本的用户,在Win XP和Vista上,在安装了东方语言支持的情况下,提交了关于日文文本在重新加载内容时显示为胡言乱语的断断续续报告 通常,英语和日语是混合的,并且大部分显示都没有问题,例如: Inventory turns partnerships. 在庫回転率の ŒÉñ?“]-¦Œüã‚Ì·•Ê‰?-vˆö‚ðŽû‰v‚ÉŒø‰?“I‚ÉŒ

我正在Delphi2009中开发一个应用程序,它大量使用RTF,使用TRichEdit和TLMDRichEdit进行编辑。在这些RTF控件中输入日文文本的用户,在Win XP和Vista上,在安装了东方语言支持的情况下,提交了关于日文文本在重新加载内容时显示为胡言乱语的断断续续报告

通常,英语和日语是混合的,并且大部分显示都没有问题,例如:

Inventory turns partnerships.  在庫回転率の
ŒÉñ?“]-¦Œüã‚Ì·•Ê‰?-vˆö‚ðŽû‰v‚ÉŒø‰?“I‚ÉŒ‹‚т‚¯‚é’mŽ¯‚ª‘÷Ý‚·‚é?(マーケットセクター、
見込み客の優  先順位と彼らに販売する知識)
(如果日文内容有误,我深表歉意——我不会说也不会读日文)

但是,通常只有文本的日语部分会胡言乱语,例如:

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的显示转换为大多数读者都能处理的方式,但我还没有找到解决方案,例如:
而且。

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

我看到了一些类似的东西,但不是日语字体。只是一些特殊的字符,比如微升和上标。问题是,尽管我从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
Private Function convertertftounicode(ByVal值作为字符串)作为字符串
Dim ch As Char()=value.ToCharArray()
dimcaschar
将sb设置为新系统。Text.StringBuilder()
作为整数的Dim代码
对于i,整数=0到通道长度-1
c=ch(i)
代码=Microsoft.VisualBasic.AscW(c)

如果代码进一步的调查显示更改字体不是一个好主意。具体来说,更改指定的字符集是不允许的,因为\fcharset0是ANSI,而\fcharset128是Shift JIS。至少从表面上看,在具有不同字符集的不同字体之间进行交换将允许您正确编码用户输入的内容。不幸的是,它仍然不能很好地解释为什么RTF控件不能正确显示。感谢您提供的示例代码!起初我尝试了类似的方法,但没有什么区别,因为RTF字符流本身不包含任何Unicode。然而,这仍然是一个非常有用的函数,如果涉及到多个RTF库,那么从RTF到RTF的不同翻译是一个潜在的原因。如果RTF编写器发出的代码读者不理解,则一切皆有可能。在Windows 10上使用写字板打开时,字体名称“82l”“82r”“82o”“83S”“83V”“83b”“83N”显示为
“MS PGothic”
。当使用LibreOffice或Win 7上的写字板打开时,它显示为
'MS Pゴシック'。请注意字体名称?l?r?o?S?V?b?N;在您的问题中,似乎已经损坏,我猜它是文档先前状态中的'82l'82r'82o'83S'83V'83b'83N。您可以添加一些RTF示例吗?