[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/11/09(Thu) 14:52
投稿者名:かい
Eメール:
URL :
タイトル:
テキストから文字を取得したいのですが
はじめまして。

VB6.0でテキストの文章を読み込んでHTMLファイルを作成するプログラムを作っています。
渡されたテキストファイルはユニコード(UTF-16)でADODB.stream を使用して、
読み込んでいるのですが、その場合㎥(立方メートル)u(平方メートル)等が?で表示
されてしまいます。
なんとか普通にそのまま表示させる方法は無いでしょうか。

投稿時間:2006/11/09(Thu) 14:54
投稿者名:Blue
Eメール:
URL :
タイトル:
Re: テキストから文字を取得したいのですが
どこに表示させているんでしょうか?
VB6.0のコントロールは確かUnicode対応していないので、
Shift_JISで表せない文字は表示できなかったと思います。
(=イミディエイトやローカルウインドウで見れない文字はNG)

投稿時間:2006/11/09(Thu) 20:48
投稿者名:かい
Eメール:
URL :
タイトル:
Re^2: テキストから文字を取得したいのですが
> どこに表示させているんでしょうか?
> VB6.0のコントロールは確かUnicode対応していないので、
> Shift_JISで表せない文字は表示できなかったと思います。
> (=イミディエイトやローカルウインドウで見れない文字はNG)

>Blue様
お返事ありがとうございます。
VB6.0ではやはりむりでしょうか。
ありがとうございました。

投稿時間:2006/11/09(Thu) 16:14
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: テキストから文字を取得したいのですが
> 読み込んでいるのですが、その場合㎥(立方メートル)u(平方メートル)等が?で表示
> されてしまいます。

まず、それらの文字は、Unicode テキストファイル上では、どのようなバイナリ値になっていますか?

また、化ける件に関しては、Stream に取り込んだ際に、既に化けているのでしょうか。
それとも、Stream にまでは正常に取り込まれているものの、それを表示するときに
化けているのでしょうか?


もし、Shift_JIS 環境への表示時に化けるという状況だとしたら、立方メートルは、
 Shift_JIS : 該当なし
 Unicode : U+33A5
なので仕方ないにしても、平方メートルは、
 Shift_JIS : 0x8775
 Unicode : U+33A1
のようにマッピングされているので、通常は化ける事はないかと思います。


> HTMLファイルを作成するプログラムを作っています。
作成する HTML ファイルの文字コードは何を採用されているのでしょうか。

もしも UTF-8 以外での出力を行っているのであれば、それらの文字を、
「㎥」「&#33a5;」「蝵」「㎡」などの数値参照で行うようにした上で、
必要に応じて lang 属性の指定や、CSSによるフォントの指定まで行うようにすれば、
一応の回避はできるような気がします。

投稿時間:2006/11/09(Thu) 20:47
投稿者名:かい
Eメール:
URL :
タイトル:
Re^2: テキストから文字を取得したいのですが
>魔界の仮面弁士 様
お返事ありがとうございます。

> まず、それらの文字は、Unicode テキストファイル上では、どのようなバイナリ値になっていますか?
立方メートルが FF,FE,A5,33,
平方メートルが FF,FE,A2,33,
です。

>
> また、化ける件に関しては、Stream に取り込んだ際に、既に化けているのでしょうか。
> それとも、Stream にまでは正常に取り込まれているものの、それを表示するときに
> 化けているのでしょうか?

そうです。Streamに取り込んだ際にすでに化けてしまっています。
> > HTMLファイルを作成するプログラムを作っています。
> 作成する HTML ファイルの文字コードは何を採用されているのでしょうか。
HTMLファイルにはShift-JISを採用しています。

> もしも UTF-8 以外での出力を行っているのであれば、それらの文字を、
> 「㎥」「&#33a5;」「蝵」「㎡」などの数値参照で行うようにした上で、
> 必要に応じて lang 属性の指定や、CSSによるフォントの指定まで行うようにすれば、
> 一応の回避はできるような気がします。

数値参照で表示を考えているのですが、ファイル数が多いので、プログラムで自動変換できる
ようにと考えています。

投稿時間:2006/11/09(Thu) 23:59
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: テキストから文字を取得したいのですが
> > まず、それらの文字は、Unicode テキストファイル上では、どのようなバイナリ値になっていますか?
> 立方メートルが FF,FE,A5,33,

ん……? BOMが付いていますね。
1文字につき、1つのファイルなのですか?

> 平方メートルが FF,FE,A2,33,
> です。
それが本当なのだとしたら、元のテキスト自体が破損しています。
U+33A2 は、平方キロメートルのはずですし。


> > また、化ける件に関しては、Stream に取り込んだ際に、既に化けているのでしょうか。
> > それとも、Stream にまでは正常に取り込まれているものの、それを表示するときに
> > 化けているのでしょうか?
> そうです。Streamに取り込んだ際にすでに化けてしまっています。
それでは、その化けたバイナリ値を教えてください。

Stream にテキストを取り込んだ後、
 .Position = 0
 .Type = adTypeBinary
 バイト配列変数 = .Read(adReadAll)
のようにすれば、バイナリを得ることができます。


> HTMLファイルにはShift-JISを採用しています。
HTML への出力なので、"Shift-JIS" ではなく、"Shift_JIS" ですね。


> 数値参照で表示を考えているのですが、
数値参照にしたい文字が少ないなら、Replaceメソッドあたりを使う事になるでしょうが、
そうした文字が多いなら、一文字ずつ数値参照に変換しながら、Print # していく、とか。


ひとつひとつ数値参照に置き換えていく以外の方法を考えるとすると……MSHTML から
DOM で出力して、それを IPersistFile::Save するとか……かな?
(文字コードを指定できるのかどうかが微妙なので、無理かも)

投稿時間:2006/11/11(Sat) 13:00
投稿者名:かい
Eメール:
URL :
タイトル:
Re^4: テキストから文字を取得したいのですが
>魔界の弁士様
ご返事ありがとう御座います。

> ん……? BOMが付いていますね。
> 1文字につき、1つのファイルなのですか?
あ、秀丸がBOM付き設定になってました・・・orz

> > 平方メートルが FF,FE,A2,33,
> > です。
> それが本当なのだとしたら、元のテキスト自体が破損しています。
> U+33A2 は、平方キロメートルのはずですし。
さらに・・・・平方キロでした・・・・orz
すいません
>
> それでは、その化けたバイナリ値を教えてください。
>
> Stream にテキストを取り込んだ後、
>  .Position = 0
>  .Type = adTypeBinary
>  バイト配列変数 = .Read(adReadAll)
> のようにすれば、バイナリを得ることができます。
>
言われたとおりにやってみましたが 「adTypeBinaryが宣言されていません」というエラーが出て
しまいました。どこかで宣言するのでしょうか?それとも何か設定が足りていないのかな? 
> > HTMLファイルにはShift-JISを採用しています。
> HTML への出力なので、"Shift-JIS" ではなく、"Shift_JIS" ですね。
orz
ご指摘ありがとう御座います。

自分でもバイナリに変換する方法は引き続き調べています。
もしよろしかったらご教授ください。

投稿時間:2006/11/11(Sat) 15:17
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^5: テキストから文字を取得したいのですが
>>> そうです。Streamに取り込んだ際にすでに化けてしまっています。
Streamに取り込んだ時に化けたのか、それとも、取り込んだものを
Streamから出力する際に化けたのかを、どうやって切り分けましたか?


> 言われたとおりにやってみましたが 「adTypeBinaryが宣言されていません」というエラーが出て
> しまいました。どこかで宣言するのでしょうか?それとも何か設定が足りていないのかな?
ADO のバージョン 2.5 以上を参照設定してみてください。その上で、先に書いたように
 Dim stm As ADODB.Stream
 Set stm = New ADODB.Stream
  (中略)
 stm.Type = adTypeBinary
という感じでいけるかと思います。
なお、参照設定しない場合は、適切な Const 定義を自分で記述する必要があります。

投稿時間:2006/11/12(Sun) 13:51
投稿者名:かい
Eメール:
URL :
タイトル:
Re^6: テキストから文字を取得したいのですが
>魔界の弁士様
非常にわかりやすい解説ありがとうございます。
参照設定で上手くコードが取れるようになりました。

    With CreateObject("ADODB.Stream")  'または With New ADODB.Stream
        .Open
        .LoadFromFile pi_strFilePath
        Do Until .EOS
            .Position = 0
            .Type = adTypeBinary
            'strdata = .ReadText(adReadLine)
            strdata = .Read(adReadAll)
            Ates = strdata
            For inttest = 0 To UBound(Ates)
                Debug.Print Ates(inttest) & " = " & Chr(Ates(inttest))
            Next
            
            Debug.Print strdata

このような形で読み込んでみたところ。
イミディエイトには
255 =
254 =
165 = ・
51 = 3
??
といった形で入ってきました。
ちなみに平方キロの場合は
255 =
254 =
162 = 「
51 = 3
??
という形で入ってきました。

投稿時間:2006/11/13(Mon) 13:11
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^7: テキストから文字を取得したいのですが
> 'strdata = .ReadText(adReadLine)
> strdata = .Read(adReadAll)
strdata という事は、Byte配列ではなく、String の変数ですよね。
こういうときは、文字列型を介さず、直接 Byte 配列に入れてチェックした方が安全かと。

> Ates = strdata
> For inttest = 0 To UBound(Ates)
>     Debug.Print Ates(inttest) & " = " & Chr(Ates(inttest))
> Next
Ates というのは、バイト配列ですか?
UTF-16の各バイト値を Chr() にかけていっても、意味のある結果は得られないのでは。

> 255 =
> 254 =
> 165 = ・
> 51 = 3
つまり、16進数で表記すれば、「FF,FE,A5,33」という事ですね。

> ちなみに平方キロの場合は
> 255 =
> 254 =
> 162 = 「
> 51 = 3
こちらは、「FF,FE,A2,33」となりますよね。


『Streamに取り込んだ際にすでに化けてしまっています。』とのことでしたが、元データは、
>>> 立方メートルが FF,FE,A5,33,
>>> 平方メートルが FF,FE,A2,33,
だったのですから、何の問題も無く取り込まれているように見えますけれども……?


もう一度、出力部分のコードを見直してみてはいかがでしょう。

投稿時間:2006/12/12(Tue) 10:44
投稿者名:かい
Eメール:
URL :
タイトル:
Re^8: テキストから文字を取得したいのですが
> > 'strdata = .ReadText(adReadLine)
> > strdata = .Read(adReadAll)
> strdata という事は、Byte配列ではなく、String の変数ですよね。
> こういうときは、文字列型を介さず、直接 Byte 配列に入れてチェックした方が安全かと。
>
> > Ates = strdata
> > For inttest = 0 To UBound(Ates)
> >     Debug.Print Ates(inttest) & " = " & Chr(Ates(inttest))
> > Next
> Ates というのは、バイト配列ですか?
> UTF-16の各バイト値を Chr() にかけていっても、意味のある結果は得られないのでは。
>
> > 255 =
> > 254 =
> > 165 = ・
> > 51 = 3
> つまり、16進数で表記すれば、「FF,FE,A5,33」という事ですね。
>
> > ちなみに平方キロの場合は
> > 255 =
> > 254 =
> > 162 = 「
> > 51 = 3
> こちらは、「FF,FE,A2,33」となりますよね。
>
>
> 『Streamに取り込んだ際にすでに化けてしまっています。』とのことでしたが、元データは、
> >>> 立方メートルが FF,FE,A5,33,
> >>> 平方メートルが FF,FE,A2,33,
> だったのですから、何の問題も無く取り込まれているように見えますけれども……?
>
>
> もう一度、出力部分のコードを見直してみてはいかがでしょう。


大変遅くなってもうしわけありません。
一応結果報告を。
結局時間が間に合わなくて、手作業になりました。
魔界の仮面弁士様ご助言ありがとう御座いました。

投稿時間:2006/11/11(Sat) 20:26
投稿者名:スクリプトプログラマ
Eメール:
URL :
タイトル:
Re^4: テキストから文字を取得したいのですが
一旦、<meta ... charset=unicode ...>でHTMLを作成して、
それをIEで開いて、ie.document.designMode='On'にして、
外からie.document.charset="shift_jis"に変更して、
ie.execWBで上書き保存すればよいと思います。

テキストだけなら、htmlfileをCreateObjectして、
<div>をwriteして、document.charset="shift_jis"にして、
そのinnerTextに代入して、innerHTMLを取り出せばよいと思います。

投稿時間:2006/11/12(Sun) 13:54
投稿者名:かい
Eメール:
URL :
タイトル:
Re^5: テキストから文字を取得したいのですが
>スクリプトプログラマ様
お返事ありがとうございます。

> 一旦、<meta ... charset=unicode ...>でHTMLを作成して、
> それをIEで開いて、ie.document.designMode='On'にして、
> 外からie.document.charset="shift_jis"に変更して、
> ie.execWBで上書き保存すればよいと思います。
>
> テキストだけなら、htmlfileをCreateObjectして、
> <div>をwriteして、document.charset="shift_jis"にして、
> そのinnerTextに代入して、innerHTMLを取り出せばよいと思います。
これは、VBスクリプトですか?
試してみます。
また解らないことがあったらお聞きするかもしれませんがその時はお願いいたします。