2016-06-29 50 views
0

我最近不得不處理一些使用Unicode字符串的複雜問題(使用PHP,這是一種我很熟悉的語言)。 mbstring的擴展功能實際上工作不正常,我們試圖利用Unicode字母的巨大痛苦,這些字母與ASCII文本是一個微不足道的問題,已經以各種方式解決。是否存在大寫Unicode文本的可靠方法?

如果我必須用ASCII文本解決這個問題,那麼我可能只是拿這個字符,檢查它是否是一個字母,然後從它的ASCII值中減去32,例如!但就目前而言,我找不到任何解釋Unicode文本大寫問題已解決的問題:我是否需要存儲完整的關聯表以將每個小寫字符映射到其相關的大寫版本?我想(和希望)我會聽到一個巨大的NO

問題的核心:在使用Unicode字符操作時,是否有任何方法將小寫字符正確轉換爲大寫字母(和背部)?如果是這樣的話,哪些策略適用?

對於這個測試假設你沒有任何,但真的任何模塊可用:沒有mbstring,沒有iconv,沒有。此外,爲了簡單起見,假設存在識別已解決的單個字符的問題,我們的String對象具有nextChar()方法,該方法可用於查找與字節長度無關的下一個字符。假設你想要做的是取一個字符串,用nextChar()對它進行迭代,並且如果可能的話,對於每個字符,將其大寫。

如果不清楚或需要更多的信息簡單地發表意見,我會盡量解答您的疑惑,如果他們甚至沒有在這段時間,我的大;)

+1

我認爲這確實是用表格*和*做的,因爲該表格取決於文本的語言。一個例子是在土耳其語中,'i'的大寫版本是虛線的大寫字母'İ'。實際上,我認爲唯一的方法就是找到一個可以爲你做到這一點的圖書館。 – roeland

+0

你可能是對的,我注意到找到固定的規則甚至是非常困難的!如果我們採用希臘語(大寫字母爲U0391 - U03A9),除U03A2外,我們可以遵循「添加22」的規則,但如果我們經過它並移動到科普特語字母表,人物似乎會遵循某種「加1 」。我猜Unicode會帶來更多的問題,直到我們找到一種更智能的方式處理它! – PoPeio

+0

那麼你必須知道你在做什麼。移動文本很容易,但您必須小心瞭解文本的編碼方式。如果您開始執行排序,大小寫,截斷等操作,您應該只需找到一個庫。例如有一個[ICU封裝](http://us2.php.net/manual/en/book.intl.php)。 – roeland

回答

1

你可以試試PortableUTF8庫,寫成替代到mbstring和iconv。

http://pageconfig.com/post/portable-utf8

另一個有趣的庫是包含字符串。它在默認情況下與mbstring一起工作,但如果未找到模塊,它將使用polyfill包。

https://github.com/danielstjules/Stringy

爲了提高它的有趣的閱讀問題的認識:

What factors make PHP Unicode-incompatible?

我希望這將是對你有用。

+0

感謝您的建議,但是如果您打開鏈接(http://pageconfig.com/attachments/portable-utf8。php)並尋找'函數utf8_case_table()'你會看到他正在使用一個映射表,而我的問題其實都是關於避免它的方法!我不是要求我可以複製 - >粘貼 - >部署,我希望更多地瞭解有關可用策略的更多信息 – PoPeio

+1

嗨,我沒有意識到portable-utf8使用的是映射表。 php和unicode的問題非常複雜......實際上,由於Unicode問題,PHP6被放棄了。我相信你可以實現它。 您可以深入研究mbstring擴展源代碼,它用c語言編寫,但構建您的我們的版本可能需要大量的時間。 https://github.com/php/php-src/blob/master/ext/mbstring/php_unicode.c – manuelbcd

+0

絕對!這就是爲什麼我不會重新發明車輪:P我只是想更好地瞭解現有的車輪如何工作。順便說一下,'Stringy'的東西非常有趣,我只是發現無用的插入任何支持'foreach',我相當確定它將需要單個字節,而不是字符,但它非常有趣,感謝分享! – PoPeio

相關問題