質問:このままではUTF-8→UNICODE→UTF-8変換すると文字化けしませんか?
(自分の環境で問題になった件と同じ現象がでそうなので・・・)
このままUTF-8からUNICODEに変換すと・・・UNICODEの最後にNULLが付加されません。
コード:
' UTF-8からUnicodeに変換
l=MultiByteToWideChar(CP_UTF8, 0, source, -1, 0, 0)
u2s_out=calloc(l*2)
MultiByteToWideChar(CP_UTF8, 0, source, -1, u2s_out, l)
しかし、次の処理では
l=WideCharToMultiByteでバイト数を取得する際に、文字数を自動(
-1:UNICODEの最後はNULLで終わる)に設定)しています。
コード:
' UnicodeからShift-JISに変換
l=WideCharToMultiByte(CP_ACP, 0, u2s_out, -1, 0, 0, 0, 0)
UTF8toSJIS=ZeroString(l)
WideCharToMultiByte(CP_ACP, 0, u2s_out, -1, UTF8toSJIS, l, 0, 0)
つまり、NULLが2バイト連続で続く領域までが文字変換の対象になりますので、変換結果は保証されません!
PS.自分は
S-JIS変換 CP_UTF8 を CP_ACP に変えて、念の為にバイト数&ワード数を指定して使用しています。
山本様へ
コード:
Declare Function WideCharToMultiByte Lib "Kernel32" (
CodePage As Long,
dwFlags As DWord,
lpWideCharStr As WordPtr,
cchWideChar As Long,
lpMultiByteStr As BytePtr,
cbMultiByte As Long,
lpDefaultChar As BytePtr,
lpUsedDefaultChar As DWordPtr
) As Long
も標準で定義出来ないでしょうか?
MultiByteToWideCharは定義済み