Language agnostic 检测rtf标记中的多字节和中文字符

Language agnostic 检测rtf标记中的多字节和中文字符,language-agnostic,unicode,localization,rtf,multibyte,Language Agnostic,Unicode,Localization,Rtf,Multibyte,我正在尝试翻译和解析一条RTF格式的消息(我需要保留格式标记,这样我就不能使用粘贴到RichTextBox中并取出.PlainText的技巧) 取字符串a的RTF代码基Bমূcιd直接粘贴到写字板: {\rtf1\ansi\ansicpg1252\deff0\deflang2057{\fonttbl{\f0\fnil\fcharset0 Calibri;}{\f1\fswiss\fcharset128 MS PGothic;}{\f2\fnil\fcharset1 Shonar Bangla;}

我正在尝试翻译和解析一条RTF格式的消息(我需要保留格式标记,这样我就不能使用粘贴到
RichTextBox
中并取出
.PlainText
的技巧)

取字符串
a的RTF代码基Bমূcιd
直接粘贴到写字板:

{\rtf1\ansi\ansicpg1252\deff0\deflang2057{\fonttbl{\f0\fnil\fcharset0 Calibri;}{\f1\fswiss\fcharset128 MS PGothic;}{\f2\fnil\fcharset1 Shonar Bangla;}{\f3\fswiss\fcharset161{\*\fname Arial;}Arial Greek;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs22 a\f1\fs24\'8a\'ee\f0\fs22 b\f2\fs24\u2478?\u2498?\f0\fs22 c\f3\fs24\'cf\'e9\f0\fs22 d\par
}
很难看出你是否与RTF没有太多关系。这就是我要看的部分

\'8a\'ee\f0\fs22 b\f2\fs24\u2478?\u2498?\f0\fs22 c\f3\fs24\'cf\'e9
注意
u+57FA
)是
\'8a\ee
但是
মূ,实际上是两个字符
\u2478?
)和
\u2498?
)是
\u2478?\u2498?
,这很好,但是
是两个独立的字符
\'cf\e9

有没有办法确定我看到的东西应该是一个字符,比如
=
\'bb'f9
或两个字符
crmk_
ι
=
\'cf'e9

我在想可能是
\lang
就是它,但事实并非如此,因为
\lang
与第一次设置时没有变化。我已经在解释字体中不同
字符集
值的不同代码页,但它似乎没有告诉我是否应该将相邻的两个Unicode引用视为双字节字符


如何判断我正在查看的字符是双字节(或多字节)还是单字节?

\'xx
转义符表示字节,应使用
fcharset
编码进行解释。(或潜在的
cchs
。如果不存在,则返回到
ansicpg
。)

您需要知道编码是紧密的,以便能够确定单个
\'xx
序列是单独表示一个字符,还是只是多字节字符的一部分;通常,在使用任何可用的库或操作系统接口将字节字符串转换为Unicode字符串之前,您将以一个单元使用文本的每个部分,以避免为RTF支持的每个代码页逐个字节地编写解析器

\uxxx?
转义符表示UTF-16代码单元。这要简单得多,但是Word[pad]作为最后手段只能产生这种形式的编码,因为它与早期的RTF版本不兼容。(
是接收器无法处理Unicode时的回退字符。)

因此:

  • 这两个字符
    ι
    表示为双字节转义,因为与该文本段相关联的字体使用希腊单字节编码(charset 161=cp1253)

  • 一个字符
    表示为双字节转义,因为与该文本段关联的字体使用的是日语多字节编码(charset 128=cp932)≈ 轮班(JIS)。在Shift JIS中,前导的
    \'8a
    字节表示还有一个字节将要到来,顶部位集范围内的其他各种字节(但不是全部)也是如此

  • 两个字符
    মূ
    表示为Unicode代码单元转义,因为没有其他选项:没有任何RTF兼容的包含孟加拉语字符的代码页。(ISCII的代码页57003来得晚了很多。)


RTF具有用于指定用于编码Unicode字符的代码页/编码的标记。字符的实际十六进制代码是指定编码使用的字节八位字节。在这种情况下,
\ansicpg1252
用于Ansi代码页1252。

如果我知道fcharset编码,我如何使用它来确定我使用的是单字节字符还是双字节字符?或者是否有一个范围(如\8-\f或类似的范围)可以与编码结合使用,以决定是否需要读取下一个字符?是的,有一个前导字节范围表示多字节序列,该范围因每个多字节编码而异。请参阅,然后查找各个代码页。比如说(≈轮班(JIS)。一次读取一段文本中的所有字节,然后使用您环境中可用的任何现有编码处理(例如在.NET中编码)将其转换为字符,比尝试逐字节读取要简单。我希望我可以不止一次投票,我的问题是如何在逐字节的基础上重新组合字符,我改为读取所有字节,然后使用.NET编码转换它们,它工作得非常好!