データ文字を国際化させるには?

解決


えんこーだぁ  2005-11-29 00:36:04  No: 92966

いつも拝見させてもらってます。

VB6.0で開発中です。
データのエンコードについてお尋ねしたく書き込みしています。

ソフトをアジア圏の各WindowsXPに対応させるため
英語と日本語の両言語で開発しています。

しかし、OSが英語WindowsXPでは大丈夫なのですが
韓国語WindowsXPでおかしな動作をしてしまいます。
データの読み込みはCSV形式(カンマ区切り)で入出力させています。
文字コードは、ANSIでした。
動作がおかしくなったのでUnicodeにしたところ
うまく読み込めませんでした。

質問がうまく書けてなくて申し訳なのですが、
VB6.0でデータ入出力時「Unicode」を使えるようにする方法を
教えていただけませんでしょうか?
よろしくお願いします。

<現在使っているデータの例>

0,1          ’← 英語/日本語の判断
"りんご","オレンジ","ぶどう","Apple","Orange","Grape"
"ライオン","トラ","Lion","Tiger"


えんこーだぁ  2005-11-29 00:49:23  No: 92967

追加発言:

過去の
http://madia.world.coocan.jp/vb/vb_bbs/200404_04040092.html
などを拝見させていただいたのですが、

私のやりたいこととしては、うまくデータが読み込めさえすれば
「Unicode」をそのままソフトの中で使用できなくても良いのです。
上記の私の発言では誤解を招いてしまうかと思い、加筆します。

すみません。要領を得ない発言で・・・。

○やりたいこと
現在のデータを韓国語WindowsXP、中国語WindowsXPで
読み込めるようにしたい。
(その際データ内の日本語は表示させないのでプログラムが動きさえすればよい)

○現在のエラーと思われるもの
例えば・・・
"りんご","オレンジ","ぶどう","Apple","Orange","Grape"が
"繧翫s縺・,"繧ェ繝ャ繝ウ繧ク","縺カ縺ゥ縺・,"Apple","Orange","Grape"
などとなってしまい、データの区切りが乱れるため
と思われます。。。


魔界の仮面弁士  2005-11-29 00:50:04  No: 92968

> 動作がおかしくなったので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 オブジェクトを
使うという手法もあります。こちらは、任意の文字コードを指定して、
ファイルを読み書きする事ができます。


魔界の仮面弁士  2005-11-29 00:53:32  No: 92969

> "繧翫s縺・,"繧ェ繝ャ繝ウ繧ク","縺カ縺ゥ縺・,"Apple","Orange","Grape"

化け方からして、"UTF-8" のバイナリを Shift_JIS で読み込もうとして
化けてしまっているようですね。

この場合は、ADODB.Stream を用いて読み書きするようにすれば良いでしょう。
Streamを使ったサンプルが、過去ログに幾つかありますので、
検索してみてください。


えんこーだぁ  2005-11-29 02:12:13  No: 92970

魔界の仮面弁士さま

アドバイスありがとうございます。
色々と要領を得なくてすみません。<(_ _)>

アドバイスを参考に色々と調べてみて、入出力部分を書き換えたのですが、
エンドレスループになってしまって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

-----------------------------------------------------

初心者過ぎてすみません。<(_ _)>


えんこーだぁ  2005-11-29 02:58:56  No: 92971

訂正:

    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
----------------------------------------------------------------

すみません、こっちが今テストしているプログラムです。
先ほどのはコピーミスです。
(自分のメモをアップしてしまいました)


魔界の仮面弁士  2005-11-29 03:00:28  No: 92972

> Do Until .EOS
>    .ReadText ioData
> Loop

いや、ReadText の戻り値を受け取らないと。(^^;

それと、わざわざループさせずとも、
 S = .ReadText()
の構文を使って、一度に取得できますよ。


魔界の仮面弁士  2005-11-29 03:10:10  No: 92973

ありゃ。すれ違い。

> すみません、こっちが今テストしているプログラムです。
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行だけでも、同じ結果になるように思えます。


えんこーだぁ  2005-11-29 17:55:10  No: 92974

魔界の仮面弁士さま

返事が遅くなってしまってすみません。
(あの後、打ち合わせが入ってしまいまして・・・。)

頂いたアドバイスで一応対応できそうです。
まだ全体が完成していないのですが、頑張って完成させたいです。

> 長さゼロの文字列が
> 返される事になりますが、その点は問題ありませんか?

全てのデータを読み込むところまで
プログラムが完成していないためか、今のところは
問題なさそうです。

色々とありがとうございます。

またしばらくプログラムと格闘してから
別スレッドで質問させていただくかもしれません。<(_ _)>

今後ともよろしくお願いいたします。


えんこーだぁ  2005-11-29 17:58:33  No: 92975

すいません、「チェック」を忘れていまして。。。
(最後まで一度の発言で終わらなかったです。... _|‾|○)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加