カレンダー
< 5月 2012 >
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

タグ: UTF-8

2011.12.27 13:39:28
QA通信編集員

皆さん、こんにちは。

QA通信編集員です。

 

いやぁ、ホント寒いですねぇ。
クリスマス寒波ってことらしいですが、
北海道の人間だけど、寒いのは本当に苦手です。 

まぁ、すでに関東近郊に出てきてからの方が
長い人生になっているので、北海道出身だろうが、
すでに関係ない感じになっているんですけどね...舌を出す

 

さて、本日は、CSVファイル文字コード判定して、
その後で、文字コード変換しちゃおうって話です。

 

以前、このブログの中で、UTF-8形式のCSVファイルをダブルクリックして開くと、
Excelでは文字化けしちゃうよって話をしたのですが、
まぁ、そのときは、エディターなどで、
文字コードをSHIFT-JISに変更すれば良いよってことを書きました。

(興味のある方は、こちらから)

 

...が、このひと手間が面倒に感じることもありますよね?

 

というのも、とあるシステムから出力されるCSVファイルが、
常に、SHIFT-JIS以外の文字コードで、
しかも、そのファイルを頻繁に使うならなおさらです。

 

品質管理を行うときに、
バグトラッキングシステム(BTS)を活用している企業も多いと思いますが、
多くの企業では、そのベースのシステムとして、
TracMantisRedmineなどのOSSを活用していることと思います。

これらのシステムの多くが海外のモノなので、
CSVファイルを出力しても、SHIFT-JIS以外の文字コードを使っていることが多いのです。

まぁ、当然と言えば、当然ですけどね...舌を出す 

 

するってーと、
品質管理を行う上で、バグ情報を、
Excelで加工したいときには、
先ほどの 文字コード変換という
ひと手間が頻繁に発生しちゃうんですよね。

 

...ということで、

そのひと手間を減らすことが出来れば良いなぁ...と考えたりする訳です。

 

そこで、Excelのマクロ機能を使って、
CSVファイルを読み込むときに、
自動的に文字コード判定を行い、
SHIFT-JIS以外の文字コードなら、
文字コード変換して利用するように出来れば、
ちょっとしたことではあるものの、
ひと手間を減らすことが出来ちゃいますよね?

 

で、ネット上で、
「Excelで文字コードを、どのように判定したらいいのかなぁ」

...と、ググってみると...、

次のようなコードを見つけることが出来ると思います。

Function CharSetOfText(strFilename as String)
    Dim fso
    Dim File
    Dim htmlfile
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set File = fso.GetFile(strFilename)
    File.Name = File.Name & ".txt"
    Set htmlfile = GetObject(File.Path, "htmlfile")
    Do While htmlfile.readyState <> "complete"
        Application.Wait Now + TimeSerial(0, 0, 1)
    Loop
    CharSetOfText = htmlfile.CharSet
    File.Name = fso.GetBaseName(File.Name)
End Function

簡単に説明すると…

対象となっているファイルを、HTMLファイルとしてオープンして、
そのときに設定されている文字コードを返すって方法です。
返される文字コードは、
レジストリ内にある以下のキーに登録されている文字コードとなります。

 

HKEY_CLASSES_ROOT\MIME\Database\Charset 

 

まぁ、どんな文字コードがあるのかというのは、
時間のあるときにでも、
レジストリエディタ(C:\Windows\System32\regedt32.exe)を使って、
見て貰えればなぁ...と思います。

 

もちろん、この方法でも、大抵の場合は、うまくいきますので、
ダメって訳ではありません。

ただ、この方法は、Internet Explorerなどのブラウザでファイルを開いたときと同様に、
文字コードを正確に認識出来ない場合があったりするんですよね。

具体的には、
Unicodeのファイルで、先頭が
1バイトコードの文字になっていると、
ほとんどがSHIFT-JISと認識してしまうんです。


「あれっ、正しく認識してくれないや」と思ったら、
このコードは、使わない方が良いでしょうね。

 

オススメの方法としては、
Linuxnkfというコマンドの文字コード解析部分を使うのが良いと思います。

...が、さすがに、別プログラムのソースコードから
新たにコードを作るってのも手間がかかっちゃいますよね。

まぁ、そこまで手間をかけるのも大変だという方には、
以下のサイトの情報が有用だと思います。

 

NonSoft - 文字コード判定のサンプル(VB6)

http://homepage2.nifty.com/nonnon/SoftSample/SampleModJUDG.html 

 

こちらのサンプルコードでは、
すべての文字コードに対応している訳ではありませんが、
まぁ、このサンプルコードに書かれている文字コードがあれば十分でしょう。 

 

また、精度としても、かなり高いと思います。

ボクが使っている範囲だけですけど、
その中では、文字コード判定で間違いは発生していません。

...しかし、このサイトのように、有用な情報を出して貰えると、
とっても助かりますよねぇ。 

 

...とまぁ、今回は、他人のコードでのお話をしてしまいましたが、
このような形で、対応するってのも、ひとつの手ではあるってことで。 

 

あっ、そうそう、文字コード判定だけしても、
Excelでは、CSVファイルを読み込んだときに、
文字化けを起こしてしまいますので、
せっかくですから、ファイルの文字コード変換もしてしまいましょう。

...ということで、最後に、
文字コード変換を行うコードを書いておきます。

 

Function ChangeCharset(strFilename as String, strBeforeCharset as String, strAfterCharset as String)
    Dim astrLine()
    ReDim Preserve astrLine(0)

    Dim objInput As Object
    Set objInput = CreateObject("ADODB.Stream")

 

    ' ファイルを読み込み、配列にデータを格納します。
    objInput.Type = adTypeText
    objInput.Charset = strBeforeCharset             ' 最初は、元の文字コードを利用します
    objInput.Open
    objInput.LoadFromFile strFilename

    Do While Not objInput.EOS
        astrLine(UBound(astrLine)) = objInput.ReadText(adReadLine)
        ReDim Preserve astrLine(UBound(astrLine) + 1)
    Loop

    objInput.Close
    Set objInput = Nothing                      ' オブジェクト解放


    ' 配列に格納されているデータをファイルに書き出します。
    Dim objOutput As Object
    Set objOutput = CreateObject("ADODB.Stream")

    objOutput.Type = adTypeText
    objOutput.Charset = strAfterCharset     ' 書き出すときに、新しい文字コードを指定します

    objOutput.Open

    Dim strLine
    For Each strLine In astrLine
        objOutput.WriteText strLine, adWriteLine
    Next

    objOutput.SaveToFile strFilename, adSaveCreateOverWrite
    objOutput.Close
    Set objOutput = Nothing                     ' オブジェクト解放

End Function

 ここでは、ファイルに上書きをしてしまっていますが、
必要に応じて、ファイルをコピーするなど入れてみて下さい。

 

大事なことを忘れていたので、追記しておきます。

 

サンプルのコードの中で、ADODB.Streamを利用して、
ファイルの読み書きをしているのですが、
ExcelのVBAマクロの中で使用する場合には、
Microsoft Visual Basic のメニュー「ツール」-「参照設定」 で、
「Mocrosoft ActiveX Data Objects」 をチェックしておく必要があります。 

いくつかバージョンもありますので、
環境に合ったバージョンを選択して下さいね。

 

では。


  文字コード判定 | 文字コード変換 | Excel | CSV | UTF-8 | SHIFT-JIS | UNICODE | JIS
コメント 0ヒット: 885  

2010.04.13 17:27:19
QA通信編集員

こんにちは。

 

QA通信編集員です。

 

今朝、テレビの情報番組の中で、「チンパンジーにも助け合いの心があるのが実験で分かった」というニュースが流れていました。ボックスの中にチンパンジーを入れて、それぞれのボックスの前には、ジュースとステッキを置くという実験で、ボックス前にジュースがあるチンパンジーが「取って!」みたいな仕草をすると、ボックス前にステッキがあるチンパンジーが取ってあげていました。

その実験の前に、お互いのチンパンジーが、交互に手伝うと両方ともジュースを飲めたって実験もやっていた訳なので、「本当に助け合いか?何か貰えると思ったんじゃね?」とか、「野生でもやるのか?」とか疑問は残りますが...。まぁ、無償の助け合いらしいです。

 

私も日々悩んで、周りの人に助けられっぱなしなので、そのうち何か恩返し出来ればと思います。
もう少し時間はかかりそうですが...。

 

さて...、今回は、前々回の記事で、CSVファイルのインポート処理のネタを書きましたが、その後、質問などもあったので、補足しておこうかと...。

 

タイトルのとおり、UTF-8形式のテキストファイル(CSVファイルやTXTファイル)をエクセルで読み込むと文字化けしてしまいます。

このため、前々回の記事のCSVファイルのインポート処理の関数を使っても、文字化けしてしまいます。
Microsoftのサイトにも、以下のような記事があります。

http://support.microsoft.com/kb/821863/ja

これは、Excel の仕様に基づく制限事項となっているので、バグでは無いらしいんですけどね...。

しかし、データベースからの出力のときに、UTF-8での出力というのも多いので、何とかして欲しいというのが、皆さんの本音ではないでしょうか?少なくても私は、直してほしいですねぇ。

 

このネタは、結構有名なのですが、それでも、たまに問い合わせを受けます。

 

対処方法は、ぜんぜん簡単です。

エディター(文字コードを変更出来る必要があります)を使って、一旦、ファイルを開き、SHIFT-JIS形式に変換後、ファイルを保存すれば、その後は、エクセルで開くことが出来ます。要は、UTF-8形式の文字コードを、SHIFT-JIS形式の文字コードに変換すれば大丈夫ということですね。

で、せっかくならば、文字コード変換するコードを追加した方が楽ですよね?

 

ということで、もう少しすると、このコードを変更すると思いますので、そのときに、UTF-8の文字コード読み込みと、変換処理を行うコードを追加したものを作ってみたいと思いますので、そのときには、改めてお話をさせてもらえればと思います。


  文字コード | UTF-8 | Excel | SHIFT-JIS | CSV | TXT
コメント 0ヒット: 5172  


ログインフォーム