我最近不得不處理一些使用Unicode字符串的複雜問題(使用PHP,這是一種我很熟悉的語言)。 mbstring
的擴展功能實際上工作不正常,我們試圖利用Unicode字母的巨大痛苦,這些字母與ASCII文本是一個微不足道的問題,已經以各種方式解決。是否存在大寫Unicode文本的可靠方法?
如果我必須用ASCII文本解決這個問題,那麼我可能只是拿這個字符,檢查它是否是一個字母,然後從它的ASCII值中減去32,例如!但就目前而言,我找不到任何解釋Unicode文本大寫問題已解決的問題:我是否需要存儲完整的關聯表以將每個小寫字符映射到其相關的大寫版本?我想(和希望)我會聽到一個巨大的NO
!
問題的核心:在使用Unicode字符操作時,是否有任何方法將小寫字符正確轉換爲大寫字母(和背部)?如果是這樣的話,哪些策略適用?
對於這個測試假設你沒有任何,但真的任何模塊可用:沒有mbstring
,沒有iconv
,沒有。此外,爲了簡單起見,假設存在識別已解決的單個字符的問題,我們的String
對象具有nextChar()
方法,該方法可用於查找與字節長度無關的下一個字符。假設你想要做的是取一個字符串,用nextChar()
對它進行迭代,並且如果可能的話,對於每個字符,將其大寫。
如果不清楚或需要更多的信息簡單地發表意見,我會盡量解答您的疑惑,如果他們甚至沒有在這段時間,我的大;)
我認爲這確實是用表格*和*做的,因爲該表格取決於文本的語言。一個例子是在土耳其語中,'i'的大寫版本是虛線的大寫字母'İ'。實際上,我認爲唯一的方法就是找到一個可以爲你做到這一點的圖書館。 – roeland
你可能是對的,我注意到找到固定的規則甚至是非常困難的!如果我們採用希臘語(大寫字母爲U0391 - U03A9),除U03A2外,我們可以遵循「添加22」的規則,但如果我們經過它並移動到科普特語字母表,人物似乎會遵循某種「加1 」。我猜Unicode會帶來更多的問題,直到我們找到一種更智能的方式處理它! – PoPeio
那麼你必須知道你在做什麼。移動文本很容易,但您必須小心瞭解文本的編碼方式。如果您開始執行排序,大小寫,截斷等操作,您應該只需找到一個庫。例如有一個[ICU封裝](http://us2.php.net/manual/en/book.intl.php)。 – roeland