2010-06-16 244 views
0

我已經在這裏搜索了這類問題的答案,並且發現了很多這樣的問題 - 但我仍然對這個問題顯而易見的瑣碎問題持懷疑態度。顯示Unicode字符

我已閱讀這個非常有趣的文章:http://www.joelonsoftware.com/articles/Unicode.html,但它讓我想知道如何在Unicode數據的緩衝區中識別單個字形。

我的問題是:

我如何去分析一個Unicode字符串,說UTF-8?

假設我知道字節順序,當遇到應該由6個字節表示的字形的開始時會發生什麼?

也就是說,如果我正確解釋了存儲的方法。

這與我正在設計使用OpenGL的文本顯示系統有關。 我將字形數據存儲在顯示列表中,我需要將字符串的內容轉換爲字形索引序列,然後將其映射到顯示列表索引(因爲顯然,將整個字形集存儲在圖形內存中並不總是實際的)。

若要將每個字符串表示爲一組短褲,則需要考慮所有需要顯示的內容,從而需要大量的存儲空間。

此外,在我看來,每個字符2個字節根本不足以代表每個可能的Unicode元素。

回答

2

我該如何解析Unicode字符串,比如說UTF-8?

我假設通過「解析」,你的意思是轉換爲代碼點。

通常情況下,您不必這樣做。例如,您可以在另一個UTF-8字符串中搜索UTF-8字符串,而不必關心那些字節表示的字符。

如果你需要轉換爲代碼點(UTF-32),則:

  1. 檢查的第一個字節,看看有多少字節的字符。
  2. 查看字符的尾部字節以確保它們處於80-BF範圍內。如果沒有,則報告錯誤。
  3. 使用位掩碼和移位將字節轉換爲代碼點。
  4. 如果獲得的字節序列長於表示字符所需的最小值,則報告錯誤。
  5. 通過序列長度遞增指針,併爲下一個字符重複。

另外,在我看來,每個字符2個 字節根本不是 足以代表一切可能的 Unicode的元素。

不是。 Unicode最初是,意思是是一個固定的16位編碼。之後決定65,536個字符不夠用,所以創建了UTF-16,並且Unicode被重新定義爲使用0到1,114,111之間的代碼點。

如果你想要一個固定寬度的編碼,你需要21位。但是它們並不是很多具有21位整數類型的語言,所以實際上你需要32位。

+0

感謝您的回覆! 根據我讀過的內容,似乎我應該使用UTF-8:我可以按照字節順序不可知的方式迭代字符串,並按照它們出現的方式組合各個代碼點,如可變長度結構。 這讓我很想知道爲什麼wchar_t和它的操縱過程中的糟糕本來就是一個非常好的主意。 – defube 2010-06-18 02:46:50

+0

'wchar_t'意圖足夠大以存儲任何字符。這使得操縱更容易,而不是更難。你可以增加一個'wchar_t *'一次來獲得下一個字符,當你有一個char *指向一個多字節字符串時,這會更難。有一個小的VC++/Windows錯誤,他們在UTF-16字符串中使用'wchar_t',但你不能爲此責怪C++。例如,在Linux上,它只是UTF-32,事情按預期工作。 – MSalters 2010-06-22 08:52:53

+0

我指的是,我必須記住它有多大和字節順序,以及設計代碼,它可以處理有點不可預知的大小和存儲的「原子」數據類型(這與「字節「與」字符「)。 UTF-8煩人迭代,但我的意圖是用它來存儲。如果wchar_t是一個UTF-32,不管編譯器如何,生活會更容易一些(儘管字節順序令人惱火,而且它強制「便攜式」序列化代碼展現出來的不雅感)。 – defube 2010-06-27 23:40:11

0

嗯,我覺得這回答是:

​​

爲什麼沒有出現在我第一次去搜索,我不知道。