ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 08:04

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - UTF8→Shift-JISへの変換
作成者 メッセージ
  記事の件名:   引用付きで返信する
変換させたい文字列がUTF-8ではないって言うのは、問題外だと思います・・・^^;
それと、Win2000は互換性の問題がかなり出ていたと思うので、そこら辺はどうなんでしょう?(調べる気にはなりませんが。)
投稿記事 Posted: 2006年11月10日(金) 18:11
  記事の件名:   引用付きで返信する
> 本当はここで答えるべきではなのですが…。
すいません、、、

> ひとつは、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と変換しようとしていた文字列を教えてください。
投稿記事 Posted: 2006年11月10日(金) 01:32
  記事の件名:   引用付きで返信する
この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さまのご指摘通り、初期は必要ないです。
かならずプログラムで設定してください。を訂正します。
投稿記事 Posted: 2005年10月06日(木) 00:44
  記事の件名:   引用付きで返信する
横槍ですが…
calloc() で確保している以上、領域は0で初期化されるのではないでしょうか?
※もちろん malloc() の場合の初期値は不定ですが
投稿記事 Posted: 2005年10月04日(火) 21:04
  記事の件名:   引用付きで返信する
Sinryowさん返信が遅くなって申し訳ありません。
もう既に解決済みとは思いますが・・・

最後の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)」とすれば大丈夫ですかね?
投稿記事 Posted: 2005年9月26日(月) 17:46
  記事の件名:   引用付きで返信する
山本様ありがとございます。
投稿記事 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は定義済み
了解しました。次回のバージョンアップで追加しておきます。
投稿記事 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は定義済み
投稿記事 Posted: 2005年9月25日(日) 09:05
  記事の件名:  UTF8→Shift-JISへの変換  引用付きで返信する
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
投稿記事 Posted: 2005年9月17日(土) 15:54

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean