2011-03-03 113 views

回答

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手冊頁。

+0

如何將substr函數與這些漢字結合使用?現在我可以用你的第三個解決方案獲得適當的長度,但是如何在中文短語中使用substr?我實際上試圖比較中文單詞(A和B)的子串,在那裏我把B的子串看作是否與A相同。 – syker 2011-03-03 06:26:20

+0

@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

+1

@syker:順便說一句,前兩個例子是說明性的,使用utf8;告訴Perl腳本本身是UTF-8,所以「長」字符串自動標記爲UTF-8。第三個是現實生活中最有用的,但我不希望所有的Encode業務都在說明字符串長度和字符串編碼之間的關係。 – 2011-03-03 06:34:54