いつも拝見させてもらってます。
VB6.0で開発中です。
データのエンコードについてお尋ねしたく書き込みしています。
ソフトをアジア圏の各WindowsXPに対応させるため
英語と日本語の両言語で開発しています。
しかし、OSが英語WindowsXPでは大丈夫なのですが
韓国語WindowsXPでおかしな動作をしてしまいます。
データの読み込みはCSV形式(カンマ区切り)で入出力させています。
文字コードは、ANSIでした。
動作がおかしくなったのでUnicodeにしたところ
うまく読み込めませんでした。
質問がうまく書けてなくて申し訳なのですが、
VB6.0でデータ入出力時「Unicode」を使えるようにする方法を
教えていただけませんでしょうか?
よろしくお願いします。
<現在使っているデータの例>
0,1 ’← 英語/日本語の判断
"りんご","オレンジ","ぶどう","Apple","Orange","Grape"
"ライオン","トラ","Lion","Tiger"
追加発言:
過去の
http://madia.world.coocan.jp/vb/vb_bbs/200404_04040092.html
などを拝見させていただいたのですが、
私のやりたいこととしては、うまくデータが読み込めさえすれば
「Unicode」をそのままソフトの中で使用できなくても良いのです。
上記の私の発言では誤解を招いてしまうかと思い、加筆します。
すみません。要領を得ない発言で・・・。
○やりたいこと
現在のデータを韓国語WindowsXP、中国語WindowsXPで
読み込めるようにしたい。
(その際データ内の日本語は表示させないのでプログラムが動きさえすればよい)
○現在のエラーと思われるもの
例えば・・・
"りんご","オレンジ","ぶどう","Apple","Orange","Grape"が
"繧翫s縺・,"繧ェ繝ャ繝ウ繧ク","縺カ縺ゥ縺・,"Apple","Orange","Grape"
などとなってしまい、データの区切りが乱れるため
と思われます。。。
> 動作がおかしくなったのでUnicodeにしたところ
> うまく読み込めませんでした。
もっと具体的に。
どのようなUnicodeテキストを、どのようなコードで読み込んだら、
どのような化け方をしてしまったのでしょうか?
> VB6.0でデータ入出力時「Unicode」を使えるようにする方法を
> 教えていただけませんでしょうか?
Unicodeといっても、そのエンコードには幾つかの種類があります。
HTML等でよく使われるのは、UTF-8。
VB6の内部文字コードは、UTF-16(LE)ですね。
(そのほか、BOM の有無による違いもあります)
その中で、UTF-16 に関しては、
Dim B() As Byte
B = "あいうえお"
として、このバイナリ(バイト配列)をそのまま Put # ステートメントで
出力すれば、Unicode テキストファイルの出来上がりです。
あるいは、FileSystemObject を使う事でも、UTF-16 のテキストを
読み書きする事ができます。
UTF-16以外のUnicodeを扱いたいのであれば、ADODB.Stream オブジェクトを
使うという手法もあります。こちらは、任意の文字コードを指定して、
ファイルを読み書きする事ができます。
> "繧翫s縺・,"繧ェ繝ャ繝ウ繧ク","縺カ縺ゥ縺・,"Apple","Orange","Grape"
化け方からして、"UTF-8" のバイナリを Shift_JIS で読み込もうとして
化けてしまっているようですね。
この場合は、ADODB.Stream を用いて読み書きするようにすれば良いでしょう。
Streamを使ったサンプルが、過去ログに幾つかありますので、
検索してみてください。
魔界の仮面弁士さま
アドバイスありがとうございます。
色々と要領を得なくてすみません。<(_ _)>
アドバイスを参考に色々と調べてみて、入出力部分を書き換えたのですが、
エンドレスループになってしまってVBが帰ってこなくなってしまいました。
ADOの使い方が全然分かっていなくて申し訳ありせん。
下記がそのプログラムです。
-----------------------------------------------------
' fNum = FreeFile
' Open txtDir & "InputOutput.txt" For Input As #freeNum
' Input #freeNum, ioData
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile "InputOutput.txt"
Do Until .EOS
.ReadText ioData
Loop
.Close
End With
-----------------------------------------------------
初心者過ぎてすみません。<(_ _)>
訂正:
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile txtDir & "InputOutput.txt"
ioData = .ReadText(-2)
ReDim Member(Eng, ioData)
Do Until .EOS
For i = 0 to ioData
For i = 0 to 1
Member(Eng, ioData) = .ReadText(-2)
Next
Next
Loop
.Close
End With
----------------------------------------------------------------
すみません、こっちが今テストしているプログラムです。
先ほどのはコピーミスです。
(自分のメモをアップしてしまいました)
> Do Until .EOS
> .ReadText ioData
> Loop
いや、ReadText の戻り値を受け取らないと。(^^;
それと、わざわざループさせずとも、
S = .ReadText()
の構文を使って、一度に取得できますよ。
ありゃ。すれ違い。
> すみません、こっちが今テストしているプログラムです。
adReadLine にて、一行ずつ処理したいのですね?
提示されたコードだと、EOSループの中で For を使っていますが、
EOS に到達した後に ReadText を使うと、長さゼロの文字列が
返される事になりますが、その点は問題ありませんか? (※)
(※)ヘルプの解説では、この部分の動作説明が間違っているので注意。
それと、内側の For ループ については、ループカウンタの i は
使われていませんし、変数 Eng も変化しないようですから、
わざわざループさせずとも、
> For i = 0 to 1
> Member(Eng, ioData) = .ReadText(-2)
> Next
.SkipLine
Member(Eng, ioData) = .ReadText(-2)
という2行だけでも、同じ結果になるように思えます。
魔界の仮面弁士さま
返事が遅くなってしまってすみません。
(あの後、打ち合わせが入ってしまいまして・・・。)
頂いたアドバイスで一応対応できそうです。
まだ全体が完成していないのですが、頑張って完成させたいです。
> 長さゼロの文字列が
> 返される事になりますが、その点は問題ありませんか?
全てのデータを読み込むところまで
プログラムが完成していないためか、今のところは
問題なさそうです。
色々とありがとうございます。
またしばらくプログラムと格闘してから
別スレッドで質問させていただくかもしれません。<(_ _)>
今後ともよろしくお願いいたします。
すいません、「チェック」を忘れていまして。。。
(最後まで一度の発言で終わらなかったです。... _|‾|○)
ツイート | ![]() |