Language agnostic 检测rtf标记中的多字节和中文字符
我正在尝试翻译和解析一条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;}
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编码转换它们,它工作得非常好!