掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB6で、DBデータ(UTF-8)を扱う方法 (ID:126902)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
まず大前提として、日本語環境下においては、 「VB6 の文字列型は UTF-16 で保持されている」という点と、 「VB6 での文字列入出力は、基本的に Shift_JIS で行われる」 という点を覚えておいてください。(UTF-8 は利用されていません) ---- > BárbaraEspaña(UTF-8)という値が それは、UTF-8のバイナリでいえば、 42 C3 A1 72 62 61 72 61 45 73 70 61 C3 B1 61 というデータという事でよろしいですか? とすれば、VB 的に言えば、 buf = "B" & ChrW(&HE1) & "rbaraEspa" & ChrW(&HF1) & "a" という事になりますね。 > ・ソBテ。rbaraEspaテアa(S-JIS)に > 化けてしまっています。 いや、化けた結果を貼られても、二重に化けちゃいますので。(^_^;) そうではなく、 Dim B() As Byte B = buf などして、それらのバイナリ値を示して下さい。 # ……でも、データの化け方を見た感じでは、元データは、 # 42 C3 A1 72 62 61 72 61 45 73 70 61 C3 B1 61 # ではなく、 # EF BB BF 42 C3 A1 72 62 61 72 61 45 73 70 61 C3 B1 61 # のようですね。DB側の 元データには、BOM を含めてあるのでしょうか? ところで、先ほど > ・ソBテ。rbaraEspaテアa(S-JIS)に のように「S-JIS」なのだと仰いましたよね。 この場合、どの時点で S-JIS 化されたのかも、非常に重要な点となります。 例えば、UTF-8 の『あ』は、「E3 81 82」というバイナリですよね。 で、「E3 81 82」というバイナリは、UTF-16 として解釈すると 『臣*』であり、Shift_JIS として解釈すると『縺*』となります。 (上記の * は、バイナリデータを意味しています) もし、DB(UTF-8)側 に『あ』が格納されており、それをVB6の文字列に 受け取るような場合、正常に文字コード変換が行われていたとすれば、 UTF-8『あ』E3 81 82 → UTF-16『あ』42 30 のように変化しますので、VB 側には、 buf = ChrB(&H42) & ChrB(&H30) 'もしくは buf = ChrW(&H3042) というデータとして渡される事になります。 その後、(Print 等で)出力する際に、UTF-16 → Shift_JIS 変換が 自動的に行われます。これが正常な状態となります。 しかし、データベース自体(あるいはミドルウェア)の設定に問題があって、 Shift_JIS 変換が先に行われてしまっており、結果として buf = "縺*" 'buf = ChrB(&H3A) & chrB(&H7e) & ChrB(??) な状態で渡されてしまうような状況だとしたら、これはもはや VB 側では手の施しようがありません。取得した時点で、データの欠損が 発生してしまっている(または、欠損する可能性がある)ためです。 一方、文字コード変換が何も行われていなかったのであれば、まだ救いはあります。 たとえば、『あ』のUTF-8バイナリが、変数 buf に無加工で格納されたなら、 buf = ChrB(&HE3) & ChrB(&H81) & ChrB(&H82) のような状態になっているはずです。(VB6 の文字列としては『臣*』の状態ですね) この場合は、UTF-8 → UTF-16 変換を VB6 側でプログラム的に行ってあげる事で、 『あ』という元データを正しく復元する事ができます。 > たとえば、UTF-8形式のファイルから、データを取得し、EXCELに貼り付ける場合 > (中略) > で可能でしょうか? テキストモード(For Input)では駄目です。使うなら、バイナリモード(For Binary)ですね。 Input ステートメント(というか、VB6の文字列処理全般)では、自動的に Shift_JIS と UTF-16 との間での変換が行われる仕様になっているので、 UTF-8 データを食べさせると、データが破損してしまうからです。 ですが、UTF-8 のテキストファイルを読み込ませたいのであれば、VB 標準の Open ステートメントを使うのではなく、ADODB.Stream というオブジェクトを 使って読み込ませた方が良いでしょう。 ADODB.Streamについては、過去ログにサンプルがありますので、探してみてください。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.