2011-11-24 68 views
2

我想翻譯解析一個RTF格式的消息(我需要保留格式標籤,所以我不能使用這個技巧,你只需將其粘貼到RichTextBox並獲取.PlainText在rtf標記中檢測多字節和中文字符

就拿RTF代碼粘貼直接到寫字板串a基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或兩個字符Οι = \'cf\'e9

我在想,也許\lang是它,但事實並非如此,因爲\lang從第一次設置時不會改變。我已經爲字體中不同的Charset值編寫了不同的代碼頁,但它似乎並沒有告訴我任何有關是否應該將兩個Unicode引用相鄰的字符視爲雙字節字符。

我怎麼知道我正在看的字符應該是雙字節(或多字節)還是單字節?

回答

7

\'xx轉義符表示字節,應該使用fcharset編碼進行解釋。 (或潛在cchs。如果不存在,回落至ansicpg。)

你需要知道編碼密切才能夠決定是否一個\'xx序列代表本身就是一個字符或僅僅是多的一部分字節字符;通常,在將該字節字符串轉換爲Unicode字符串之前,將使用文本的每個部分作爲一個單元,以避免必須爲每個由RTF支持的代碼頁編寫逐字節的解析器。

\uxxxx?轉義表示UTF-16代碼單元。這很簡單,但是Word [pad]僅僅產生這種形式的編碼作爲最後的手段,因爲它與早期的RTF版本不兼容。 (?是用於當接收器不能與Unicode的應付回退字符。)

所以:

  • 兩個字符Οι被表示爲兩個字節轉義因爲字體與該相關聯的拉伸的文本使用希臘單字節編碼(字符集161 = cp1253)。

  • 一個字符表示爲兩個字節轉義符,因爲與該文本段相關聯的字體使用日語多字節編碼(charset 128 = cp932≈Shift-JIS)。在Shift-JIS中,領先的\'8a字節表示要進一步發送字節,在頂部位集範圍(但不是全部)中的其他字節也會發送。

  • 這兩個字符মূ表示爲Unicode代碼單元轉義符,因爲沒有其他選項:沒有任何包含Bengali字符的RTF兼容代碼頁。 (代碼頁57003對於ISCII來得晚得多。)

+0

如果我知道fcharset編碼如何使用它來確定我使用單字節還是雙字節字符?或者是否存在\ 8 \ f或類似的範圍,我可以將其與編碼結合使用以決定是否需要讀取下一個字符? – Seph

+3

是的,有一系列的前導字節表示多字節序列,並且該範圍對於每個多字節編碼都不相同。請參閱[這裏的fcharsetN列表](http://latex2rtf.sourceforge.net/rtfspec_6.html),然後查找各個代碼頁。例如[cp932](http://msdn.microsoft.com/en-gb/goglobal/cc305152)(≈Shift-JIS)。通過一次讀取一段文本中的所有字節,然後使用環境中可用的任何現有編碼處理(例如,.NET中的編碼)轉換爲字符,而不是試圖讀取一個字節逐字節的基礎。 – bobince

+1

我希望我可以不止一次地投票,我的問題是如何以字節爲單位重新組裝字符,我更改爲讀取所有字節,然後使用.NET Encoding轉換它們完美的作品! – Seph

1

RTF具有用於指定用於編碼Unicode字符的代碼頁/編碼的標記。字符的實際十六進制代碼是指定編碼使用的字節八位字節。在這種情況下,\ansicpg1252爲Ansi代碼頁1252.

相關問題