作成者 |
メッセージ |
|
|
変換させたい文字列がUTF-8ではないって言うのは、問題外だと思います・・・^^;
それと、Win2000は互換性の問題がかなり出ていたと思うので、そこら辺はどうなんでしょう?(調べる気にはなりませんが。)
変換させたい文字列がUTF-8ではないって言うのは、問題外だと思います・・・^^; それと、Win2000は互換性の問題がかなり出ていたと思うので、そこら辺はどうなんでしょう?(調べる気にはなりませんが。)
|
|
|
投稿記事 |
Posted: 2006年11月10日(金) 18:11 |
|
|
|
|
|
> 本当はここで答えるべきではなのですが…。
すいません、、、
> ひとつは、UTF8(Unicode)にあってShift-JISに無い文字を変換しようとしたこと。
元々変換させたい文字がUTF8で無いと言うのが一番の問題かもしれません^^;
> もうひとつは、OSがWindows95であること。
OSは2000です。
>変換しようとしていた文字列を教えてください。
★変換しようとしていた文字列
変換したい文字列 変換元の文字列
文字版 ・・・譁・ュ礼沿
文字化けファイル名修正・・・譁・ュ怜喧縺代ヵ繧。繧、繝ォ蜷堺ソョ豁」
この説明をどうして良いのか不明だったのがここに書き込みさせて頂いた一番の理由です。
この意味不明な漢字をなんとか元に戻したいと思っていた所こちらのUTF8→Shift-JISを使用した際にいい所までは変換してくれるので、何とかならない物かと思いまして
> 本当はここで答えるべきではなのですが…。 すいません、、、 > ひとつは、UTF8(Unicode)にあってShift-JISに無い文字を変換しようとしたこと。 元々変換させたい文字がUTF8で無いと言うのが一番の問題かもしれません^^;
> もうひとつは、OSがWindows95であること。 OSは2000です。 >変換しようとしていた文字列を教えてください。 ★変換しようとしていた文字列
変換したい文字列 変換元の文字列 文字版 ・・・譁・ュ礼沿 文字化けファイル名修正・・・譁・ュ怜喧縺代ヵ繧。繧、繝ォ蜷堺ソョ豁」
この説明をどうして良いのか不明だったのがここに書き込みさせて頂いた一番の理由です。 この意味不明な漢字をなんとか元に戻したいと思っていた所こちらのUTF8→Shift-JISを使用した際にいい所までは変換してくれるので、何とかならない物かと思いまして
|
|
|
投稿記事 |
Posted: 2006年11月10日(金) 14:37 |
|
|
|
|
|
本当はここで答えるべきではなのですが…。
文字化けしてしまう原因は2つ、
ひとつは、UTF8(Unicode)にあってShift-JISに無い文字を変換しようとしたこと。
もうひとつは、OSがWindows95であること。
というわけで、使用しているOSと変換しようとしていた文字列を教えてください。
本当はここで答えるべきではなのですが…。
文字化けしてしまう原因は2つ、 ひとつは、UTF8(Unicode)にあってShift-JISに無い文字を変換しようとしたこと。 もうひとつは、OSがWindows95であること。
というわけで、使用しているOSと変換しようとしていた文字列を教えてください。
|
|
|
投稿記事 |
Posted: 2006年11月10日(金) 01:32 |
|
|
|
|
|
このUTF8→Shift-JISへの変換を利用させて頂こうと思って使用した所文字化けが起こるのですが・・・^^;
ABのVerは4.24です。
解決方法を御教授願えないでしょうか?
このUTF8→Shift-JISへの変換を利用させて頂こうと思って使用した所文字化けが起こるのですが・・・^^; ABのVerは4.24です。
解決方法を御教授願えないでしょうか?
|
|
|
投稿記事 |
Posted: 2006年11月09日(木) 20:46 |
|
|
|
|
|
hiraさまへ
C言語を勉強したのが10数年前なので・・・
(個人的にはもっと前ですが、その頃はallocしか無かったような・・・それよりもBASIC+アセンブラで書いた方が効率が良かったような気が・・・)
その頃、OS2用のプログラムを作成する際にC言語標準のメモリ確保(alloc,malloc,calloc)は使用禁止されていました。
確保されたメモリーがGDT,LDTのどちらに所属するのかコンパイラによって保障が出来なかったからです!
(どちらがGDTで、もう一方がLDTだったような気がします・・・)
そのためメモリー領域を取得するAPIを使用しなければならなかったので、確保できたメモリーの状態はユーザが保障する必要がありました!!!
ってな訳で最近C言語を使用していない自分は、確保した領域が絶対に安全であると保障されない場合限り、初期化をお勧めしているのです・・・
callocは確保した領域を0で初期化する事を保障しているようなので、hiraさまのご指摘通り、初期は必要ないです。
かならずプログラムで設定してください。を訂正します。
[b]hiraさま[/b]へ C言語を勉強したのが10数年前なので・・・ (個人的にはもっと前ですが、その頃はallocしか無かったような・・・それよりもBASIC+アセンブラで書いた方が効率が良かったような気が・・・)
その頃、OS2用のプログラムを作成する際にC言語標準のメモリ確保(alloc,malloc,calloc)は使用禁止されていました。 確保されたメモリーがGDT,LDTのどちらに所属するのかコンパイラによって保障が出来なかったからです! (どちらがGDTで、もう一方がLDTだったような気がします・・・)
そのためメモリー領域を取得するAPIを使用しなければならなかったので、[b]確保できたメモリーの状態はユーザが保障する必要がありました!!![/b] ってな訳で最近C言語を使用していない自分は、確保した領域が絶対に安全であると保障されない場合限り、初期化をお勧めしているのです・・・
callocは確保した領域を0で初期化する事を保障しているようなので、[b]hiraさま[/b]のご指摘通り、初期は必要ないです。 かならずプログラムで設定してください。を[color=red]訂正[/color]します。
|
|
|
投稿記事 |
Posted: 2005年10月06日(木) 00:44 |
|
|
|
|
|
横槍ですが…
calloc() で確保している以上、領域は0で初期化されるのではないでしょうか?
※もちろん malloc() の場合の初期値は不定ですが
横槍ですが… calloc() で確保している以上、領域は0で初期化されるのではないでしょうか? ※もちろん malloc() の場合の初期値は不定ですが
|
|
|
投稿記事 |
Posted: 2005年10月04日(火) 21:04 |
|
|
|
|
|
Sinryowさん返信が遅くなって申し訳ありません。
もう既に解決済みとは思いますが・・・
最後の2バイトに0を設定するとOKです!
領域を確保しただけでは、0は設定されないと思いますので、
必ずプログラムで設定してください。
[b]Sinryowさん[/b]返信が遅くなって申し訳ありません。 もう既に解決済みとは思いますが・・・
最後の2バイトに0を設定するとOKです! 領域を確保しただけでは、0は設定されないと思いますので、 必ずプログラムで設定してください。
|
|
|
投稿記事 |
Posted: 2005年10月04日(火) 20:16 |
|
|
|
|
|
> このまま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)
「u2s_out=calloc(l*2+2)」とすれば大丈夫ですかね?
> このまま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)
「u2s_out=calloc(l*2+2)」とすれば大丈夫ですかね?
|
|
|
投稿記事 |
Posted: 2005年9月26日(月) 17:46 |
|
|
|
|
|
山本様ありがとございます。
[b]山本様[/b]ありがとございます。
|
|
|
投稿記事 |
Posted: 2005年9月25日(日) 23:56 |
|
|
|
|
|
引用: 山本様へ
コード:
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は定義済み
了解しました。次回のバージョンアップで追加しておきます。
[quote="マティ"][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]は定義済み[/quote]
了解しました。次回のバージョンアップで追加しておきます。
|
|
|
投稿記事 |
Posted: 2005年9月25日(日) 11:14 |
|
|
|
|
|
質問:このままでは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]は定義済み
|
|
|
投稿記事 |
Posted: 2005年9月25日(日) 09:05 |
|
|
|
|
|
http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=229 をActiveBasicに移植しました。
「 Shift-JIS→UTF8への変換」とセットでどうぞ。
コード: 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
Function UTF8toSJIS(source As BytePtr) As String
Dim u2s As BytePtr
Dim u2s_out As BytePtr
Dim l As Long
' UTF-8からUnicodeに変換
l=MultiByteToWideChar(CP_UTF8, 0, source, -1, 0, 0)
u2s_out=calloc(l*2+2)
MultiByteToWideChar(CP_UTF8, 0, source, -1, u2s_out, l)
' 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)
' 後始末
free(u2s_out)
End Function
[url]http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=229[/url] をActiveBasicに移植しました。 「[url=http://www.discoversoft.net/forum/viewtopic.php?t=238]Shift-JIS→UTF8への変換[/url]」とセットでどうぞ。
[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
Function UTF8toSJIS(source As BytePtr) As String Dim u2s As BytePtr Dim u2s_out As BytePtr Dim l As Long ' UTF-8からUnicodeに変換 l=MultiByteToWideChar(CP_UTF8, 0, source, -1, 0, 0) u2s_out=calloc(l*2+2) MultiByteToWideChar(CP_UTF8, 0, source, -1, u2s_out, l) ' 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) ' 後始末 free(u2s_out) End Function[/code]
|
|
|
投稿記事 |
Posted: 2005年9月17日(土) 15:54 |
|
|
|
|