2016-06-26 13 views
0

Luaはconst char *上で動作し、ドキュメントに応じて、次の処理を行いutf8.len()という名前の関数を持っている:カウント数

は、文字列s https://www.lua.org/manual/5.3/manual.html#6.5でUTF-8文字の数を返します。

私は、Win32 APIとのインターフェイスを持つカスタマイズされたLuaを使用しています。私のアプリケーションのWin32バックエンドにUTF-8文字列を渡す必要があるときは、MultiByteToWideChar()を使ってUTF-8からWCHARに変換します。

は今、私はLuaのの utf8.len()関数と同じ 正確を行いますが、代わりにUTF-8 const char*文字列のUTF-16 WCHAR*文字列を取り機能を探しています。 Unicodeの複雑さや用語解説について私に尋ねないでください。私は既に、 という文字は、Unicodeについて言及するときに非常にあいまいですが、Luaのドキュメントではこの用語を正確に使用していると言われています(上記参照)。ですから、私が望むのは、Luaのものと全く同じ機能を果たすものですが、の代わりに WCHAR*で動作します.Luaの作者が実際に意味するものにかかわらず、 という文字はです。私は、ちょうど utf8.len()と同じカウントを与えるが、UTF-8文字列から MultiByteToWideChar()で生成されたUTF-16 WCHAR*文字列で動作する関数を持っているだけです。

私は質問は...今

一つの最後の音符十分ようやく十分に明確であると思います。私は、可能な場合にはICUのような外部のライブラリを使用しないようにしたいと思います。 Win32 APIソリューションが推奨されます。

+1

あなたは2つの異なることを求めています:*コードポイント*と*文字*。 *文字*という用語は、Unicodeを指すときに非常にあいまいです。 graphemeクラスターのようにコードポイントを意味する可能性があります。どちらを求めていますか? – IInspectable

+1

脇に:Windows SDKには 'TSTR'型はありません。あなたはおそらく 'TCHAR'を参照しており、' TCHAR'と 'wcslen()'は互換性がありません。前者は、プリプロセッサシンボルに応じて、 'char'または' wchar_t'のいずれかを表します。後者は 'const wchar_t *'だけで動作します。 – IInspectable

+1

'TCHAR'は、Windows 95/98/MEとWindows NTの両方をコーディングしたいときに便利でした。前者はUnicodeをサポートしていませんでした。しかし、少なくとも10年間、これは関係がありませんでした。あなたはUTF-16に興味があります。したがって、 'wchar_t'を使用して関連させてください。 'TCHAR'を使わないでください。あなたの質問については、*文字*の意味をよりよく定義しなければなりません。正確な定義をお願いできますか? –

答えて

1

the Lua utf8 source codeを見ると、utf8.len()はコードポイントの数を数えているだけなので、(たとえば)結合文字は別々にカウントされます。 wcslen()は、次に行く方法です。

あなたは、しかし、文字列はBMP外の文字が含まれている場合に注意すべきである(U + 10000以上;例えば、絵文字)、wcslen()utf8.len()と同じものを返すことができません。これは、UTF-16が単一のコードポイントを使用してこれらを表現できないためです。その代わりに、コードポイントを2つの特別なコードポイントに分割する必要があります。これは、サロゲートペアと呼ばれます。サロゲートペアを単一のコードポイントとして扱う必要がある場合は、その長さループを自分で記述する必要があります。