UTF-8全くコンセプトのためには、私の以前のエッセイで見ることができます:
簡潔には、UTF-8エンコーディング形式
また、使用string.subとstring.byteを知っています。
最初の完全なコード:
ローカル ザStringHelper = {}
- [[
UTF-8コード化規則。
単一バイト- 0スタート
1バイト0xxxxxxx 0から127
マルチバイト- n番目の開始1 0 1プラスの最初のバイト
110xxxxx 192バイト2 - 223
3バイト224 1110xxxx - 239
4 240 11110xxxバイト- 。247
1-4バイトがあるかもしれない
- ]
関数StringHelper.GetBytes(チャー)
IF ませんチャー次いで
戻り 0
終了
ローカルコード= string.byte (CHAR)を
IFコード< 127が その後
返す 。1つの
ELSEIFのコードを<= 223 次に
戻り 2
ELSEIFのコード<= 239 、その後
戻る 3。
ELSEIFのコード<= 247 、その後
戻る 4。
他の
- 理由ここに来ていない^ _ ^
リターン 0
エンド
エンド
機能StringHelper.Sub(STR、のstartIndex、endIndexの)
ローカル tempStr = STR
ローカル byteStart = 1。 - string.sub開始位置は、撮影した
ローカル - byteEnd = 。1 - とらstring.sub終了位置、
ローカルインデックス= 0 - 文字カウント
ローカルバイト= 0を -字符的字节记数
のstartIndex = math.max(startIndexの、1 )
endIndexの = endIndexのまたは - 1
ながら string.len(tempStr)> 0 行う
場合、インデックス==のstartIndex - 1 次に
byteStart =バイト+ 1 。
ELSEIFインデックス== endIndexの次に
byteEnd = バイト。
休憩;
終了
バイト =バイト+ StringHelper.GetBytes(tempStr)
tempStr = string.sub(STR、バイト+ 1 )
のインデックス =指数+ 1つの
端部
リターン string.sub (STR、byteStart、byteEnd)
端
基本的な考え方:
ライブラリ関数は、LUA実際のバイト傍受機能をstring.subので、クリッピング機能を書くための理由。
UFT-8エンコーディングフォーマットは、主に中国の3つのバイトなど、数字と文字によって表される1バイト、2バイトがあるいくつかの国で言語で、直接string.subを切り出すことが可能ですないように注意してくださいどのように多くのバイトをカットすることであるため、文字化け。
そのため、
GetBytesメソッドは、文字のバイト数を取得する関数定義(最初のバイトに応じて、ハイウォーターマークを、文字バイト数が決定されます)
次にシフト、バイト数と文字数レコードの数の後に続けます。
上記のように、取ると仮定された文字3-4からそれがあるべき、最後のバイトに4ワード内のバイトの最初の3つの文字を取ります
すなわち:
1 byteStart =バイト+ 1 - 文字の現在の数は、開始文字(startIndexの)前の位置、説明、次のバイト列、すなわちインデックス==のstartIndexから採取したとき
文字の現在の数は、終了文字(endIndexの)取得され、これまでのところ、すなわち文字列インデックスを取るべき記載== endIndexのbyteEnd =バイト
string.subと(STR、byteStart、byteEnd)はbyteEndバイトbyteStartに取り込むことができます
テストコード:
str = "中1文*a字符串勉強します"; print(StringHelper.Sub(str, 3, 4)) print(StringHelper.Sub(str, 1, 4)) print(StringHelper.Sub(str, 8)) print(StringHelper.Sub(str, 2, 12))
测试结果: