by マティ » 2005年9月25日(日) 09:05
質問:このままでは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は定義済み
[b]質問:[/b]このままではUTF-8→UNICODE→UTF-8変換すると文字化けしませんか?
(自分の環境で問題になった件と同じ現象がでそうなので・・・)
このままUTF-8からUNICODEに変換すと・・・UNICODEの最後にNULLが付加されません。
[code]
' 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)
[/code]
しかし、次の処理では[b]l=WideCharToMultiByte[/b]でバイト数を取得する際に、文字数を自動([color=red]-1[/color]:UNICODEの最後はNULLで終わる)に設定)しています。
[code]
' 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)
[/code]
つまり、NULLが2バイト連続で続く領域までが文字変換の対象になりますので、変換結果は保証されません!
[b]PS.[/b]自分は[b]S-JIS変換[/b] CP_UTF8 を CP_ACP に変えて、念の為にバイト数&ワード数を指定して使用しています。
[b]山本様[/b]へ
[code]
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
[/code]
も標準で定義出来ないでしょうか?[b]MultiByteToWideChar[/b]は定義済み