Luaでの文字列の長さ



String Length Lua



1.Luaで文字列の長さを取得する方法

一般的に、2つの方法があります。1つは「#」を使用して計算する方法、もう1つは文字列関数string.lengthを使用して計算する方法です。

local str1='Chinese' local str2='zhongguoren' print(#str1) --9 print(string.len(str1)) --9 print(#str2) --11 print(string.len(str2)) --11

ここでの3つの漢字の結果は9バイトであることがわかります。これは主に、luaで採用されているutf-8エンコーディングの計算方法によるものです。



次に、utf-8エンコーディングを理解するだけで、luaの文字列をよりよく理解して処理できるようになります。

2つのutf-8エンコーディングルール

UTF-8エンコード規則は、次のように非常に単純です。



  • シングルバイトシンボルの場合、バイトの最初のビットは0に設定され、最後の7ビットはこのシンボルのUnicodeコードです。したがって、英字の場合、UTF-8エンコーディングとASCIIコードは同じです。
  • for nバイト記号(n > 1)、最初のバイトの前nビットが1に設定される前、最初のn + 1ビットが設定される0、次のバイトの最初の2桁はすべて設定されています10。言及されていない残りのバイナリビットは、このシンボルのすべてのUnicodeコードです。

より直感的な表現方法は次のとおりです。

ここで理解する必要があるのは、各バイトの10進範囲です。



  • シングルバイト:0-127
  • 2バイト:最初のバイトは192-223、2番目のバイトは127-192
  • 3バイト:最初のバイトは224-239です
  • 4バイト:最初のバイトは240-247、他のバイトは127-192です

UTF-8は1〜4バイトを使用して各文字をエンコードし、さまざまなシンボルのエンコードされたバイト数は次のとおりです。

  • US-ASCIl文字は1バイトのエンコードのみを必要とします(Unicodeの範囲はU + 0000〜U + 007Fです)。
  • ラテン語、ギリシャ語、キリル文字、アルメニア語、ヘブライ語、アラビア語、シリア語、およびその他の発音区別符号付きの文字には、2バイトのエンコードが必要です(Unicodeの範囲はU +0080からU + 07FF)。
  • 他の言語(中国語、日本語、韓国語、東南アジア、中東などを含む)の文字には、最も一般的に使用される文字が含まれ、3バイトのエンコードを使用します。
  • 他のめったに使用されない言語文字は、4バイトのエンコーディングを使用します。

3つ目は、string.byte()関数を使用して、より多くの文字列長の計算要件を満たすことです。

Luaのstring.byte()関数を理解する:

  • プロトタイプ:string.byte(s [、i [、j]])
  • 説明:この関数は文字を返しますs[i], s[i+1], ···, s[j]内部デジタルコード(ASCIIコード)。ここで、パラメーターiデフォルト値は1、パラメーターjデフォルト値はi。これは複数の戻り値であり、負のインデックスは逆クエリに使用できます。注意:私を満たさなければならない

中国語と英語の両方の文字で1として記録したい場合、どのように対処する必要がありますか?各シンボルの最初のバイトの範囲に従ってシンボルが占めるバイト数を判断し、対応するバイトを毎回スキップして次の文字の最初のバイトに到達し、トラバースして次の文字の数を取得するという考え方です。記号

local str1='Chinese' local str2='zhongguoren' local function getByteCount(str) local realByteCount=#str local length=0 local curBytePos=1 while(true) do local step=1 - the incremental value of traversal bytes local byteVal=string.byte(str,curBytePos) if byteVal>239 then step=4 elseif byteVal>223 then step=3 elseif byteVal>191 then step=2 else step=1 end curBytePos=curBytePos+step length=length+1 if curBytePos>realByteCount then break end end return length end print(getByteCount(str1)) --3 print(getByteCount(str2)) --11