長度函數假定中文字符不止一個字符。如何確定獨立於字符編碼的Perl中字符串的長度(將中文字符視爲一個字符)?獨立於字符編碼的Perl中字符串的長度
4
A
回答
8
length
函數對字符進行操作,而不是字節(AKA字節)。字符的定義取決於編碼。漢字仍然是單個字符(如果編碼設置正確!),但是它們佔用了多於一個八位字節的空間。所以,Perl中字符串的長度取決於Perl認爲字符串所在的字符編碼;唯一與字符編碼無關的字符串長度是簡單的字節長度。
確保所討論的字符串被標記爲UTF-8並以UTF-8編碼。例如,這會產生3:
$ perl -e 'print length("長")'
,而這會產生1:
$ perl -e 'use utf8; print length("長")'
一樣:
$ perl -e 'use Encode; print length(Encode::decode("utf-8", "長"))'
如果你從一個文件中獲取你的中國字,確保你在讀取或寫入文件之前,你的文件是binmode $fh, ':utf8'
;如果您從數據庫獲取數據,請確保數據庫以UTF-8格式返回字符串(或使用Encode
爲您完成)。
我不認爲你必須擁有所有的UTF-8,你只需要確保字符串被標記爲具有正確的編碼。我會用UTF-8前後(甚至橫向),因爲這是Unicode的通用語言,如果你在任何地方使用它,它會使事情變得更容易。
如果您打算處理非ASCII數據,您可能需要花一些時間閱讀perlunicode手冊頁。
相關問題
- 1. 各種編碼的字符串長度
- 2. UTF-8編碼字符串的字符串長度
- 3. 獨立字符串
- 4. 字符集獨立字符串等於,哈希碼和比較
- 5. 字符串的長度比字符串的長度長
- 6. PHP的獨立字符串
- 7. 字符串拆分/字符串替換基於字符長度
- 8. Java編碼/解碼字符串長/長
- 9. 字符串建立:隱藏字符串長度?
- 10. 只有字符串長度大於2的子字符串
- 11. Base64編碼字符串的長度過長的iOS
- 12. 單獨的html編碼字符串和普通字符串
- 13. 獨立的子字符串中我有字符串數組C#
- 14. 基於字節而非長度的字符串長度驗證
- 15. PHP獨立URL字符串
- 16. 獨立字符串在Python
- 17. 獨立字符串逗號
- 18. 獨立字符串輸入
- 19. 獨立字符串(10)
- 20. 長URL字符串忽略編碼的字符串
- 21. 在perl中將字符串拆分爲可變長度的字符串
- 22. 基於長度的聚類字符串
- 23. 用於字符串長度的Java NPE
- 24. xslt中字符串的字節長度
- 25. python3.5中使用不同編碼的字符串的長度
- 26. bash的字符串長度
- 27. 字符串的長度(Python)
- 28. 編碼字符串長度大於max指定用戶
- 29. 如何在Java中執行獨立於編碼的字符串比較?
- 30. 的Perl:字符串中子字符串或子字符串中
如何將substr函數與這些漢字結合使用?現在我可以用你的第三個解決方案獲得適當的長度,但是如何在中文短語中使用substr?我實際上試圖比較中文單詞(A和B)的子串,在那裏我把B的子串看作是否與A相同。 – syker 2011-03-03 06:26:20
@syker:'substr'對字符(不是octects)進行操作,所以'substr'如果字符串使用正確的編碼進行標記,則應該正常工作。例如:'perl -e'使用Encode; binmode STDOUT,「:utf8」; my $ s = Encode :: decode(「utf-8」,「長μ」); print substr($ s,1,1),「\ n」「'應該給你」μ「。 – 2011-03-03 06:31:01
@syker:順便說一句,前兩個例子是說明性的,使用utf8;告訴Perl腳本本身是UTF-8,所以「長」字符串自動標記爲UTF-8。第三個是現實生活中最有用的,但我不希望所有的Encode業務都在說明字符串長度和字符串編碼之間的關係。 – 2011-03-03 06:34:54