簡體   English   中英

如何判斷Unicode代碼點是否是一個完整的可打印字形(或字形簇)?

[英]How can I tell if a Unicode code point is one complete printable glyph(or grapheme cluster)?

假設有一個Unicode String對象,我想逐一打印該String每個Unicode字符。 在我用非常有限的語言進行的簡單測試中,只要假設一個代碼點始終與一個字形相同,我就可以連續實現這一目標。

但是我知道情況並非如此,上面的代碼邏輯可能會在某些國家或語言中輕易導致意外結果。

所以我的問題是,有沒有辦法判斷一個Unicode代碼點是Java還是C#中一個完整的可打印字形? 如果我必須用C / C ++編寫代碼,那也很好。

我在Google上搜索了幾個小時,但所獲得的只是關於代碼單位和代碼點的信息。 判斷代碼單元是否是代理對的一部分非常容易,但與字素無關。

有人能指出我正確的方向嗎?

您肯定是對的,單個字形通常由多個代碼點組成。 例如,字母é(帶有重音符號的e)可以等效地寫為或組合的重音符號為\e\́ Unicode 規范化不能總是將這樣的事情合並到一個代碼點中,尤其是當存在多個組合字符時。 因此,您需要使用一些Unicode分段規則來標識所需的邊界。

您所謂的“可打印字形”被稱為用戶感知的字符或( 擴展的 )字素 在Java中,迭代這些的方法是使用BreakIterator.getCharacterInstance(Locale)

BreakIterator boundary = BreakIterator.getCharacterInstance(Locale.WHATEVER);
boundary.setText(yourString);
for (int start = boundary.first(), end = boundary.next();
        end != BreakIterator.DONE;
        start = end, end = boundary.next()) {
    String chunk = yourString.substring(start, end);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM