掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
UTF-8の文字列をセルに区切ってセットするには? (ID:87985)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>> これは、改行文字を除去する処理でしょうか? > これはただデータが全部ほしかっただけです。 .ReadText(adReadLine) の替わりに、.ReadText(adReadAll) を使って 取得すれば、ループ無しで、全データを一度に取得できますよ。 あるいは、「.ReadText(取得したい文字数)」のような事もできます。 なお、元ファイルの文字コードが UTF-8 であれ、EUC-JPであれ、 ReadTextメソッドで取り出される単位は、「文字単位/行単位/全部」です。 あくまで文字の取得であって、バイナリの取得ではありません。 もし、生のバイナリをそのまま取り出すなら、.Read()メソッドを使う事になります。 >> バイト単位で処理をされているのには、何か理由があるのでしょうか? >> 特に理由が無ければ、MidB関数ではなく、Mid関数を使ってみて下さい。 > 全角を3バイト、半角カナも3バイトで計算しないといけなかったので > MidBを使ってみました 文字コードの扱いに誤解があるようです。 確かにUTF-8では、英数字=1バイト、ロシア語等=2バイト、漢字等=3バイトで 表現されていますが、それはあくまで「UTF-8」の場合だけです。 しかし、VB6が内部で利用しているUnicodeは、UTF-8ではなく、UCS-2/UTF-16です。 また、ADODB.Streamのテキストモードでは、元のバイナリがどの形式であれ、 .ReadText()される際には、常にVB標準の文字コードに変換されています。 つまり先のコードでは、元ファイルの文字コードや、文字の種類に関係なく、 .ReadText()した時点で、常に「1文字=2バイト」で表現される文字列として 取得される事になります。ですから、それを3バイト単位で切り出して しまっては、当然データが破損してしまうというわけです。 # そもそも、Mid関数(≠MidB関数)を使えば、文字種に関係なく、「文字単位」で # 切り出せますから、Streamから読み込んだ文字列を、バイト単位で操作する意味は、 # ほとんど無いはずです。 > 取りあえず下記で対応できたので乗せときます # 載せる? ファイルに保存して開きなおしていますが、ファイル化も必要でしょうか。 ファイル化する必要が無いなら、Copy後に、「Stm2.Position = 0」を 実行すれば、Stm2の先頭から、もう一度 ReadText で読み込む事ができますよ。 あるいは、UTF-8のバイナリをShift_JIS形式のバイナリにしたいだけなら、 Stm1.Charset = "UTF-8" Dim B() As Byte B = StrConv(Stm1.ReadText(adReadAll), vbFromUnicode) のようにすればOKです。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.