
Perl初心者です。
perlで簡単なソフトを作り、時々変化する情報をテキストファイルから読み込むようにしています。
昔は、Shift-jisでしたが、文字化け対策が嫌になり、UTF-8に統一しました。
皆様は、何を使われていますでしょうか?
また、読み込みや出力には、そのファイルの文字コード指定していますか?
質問させていただいた動機について(無駄に長いです)
最近パソコン初心者の友達へ、プログラムを作ってあげたのですが、どうもうまく動かない。
設定ファイルに書いてある内容が何か合わないようです。
色々試行錯誤して、3日ほど悩んだ結果、相手のパソコンで編集(Vista)すると、BOMというものが付くことが分かり、とりあえず、それを削除することで無事動作致しました。
UTF-8であれば、文字コードなど気にせず万能だと思っていたのですが、これだけ悩まされると、UTF-8以外の方にもっと良い方法があるのではないかと思い質問させていただきました。
No.4ベストアンサー
- 回答日時:
Windowsでは歴史的要因からShift_JISと思われていますが、WindowsXP(2000)以降は、UTF8を内部的に使用しています。
しかし、Perlは、しばしば古いUNIX上で動かす可能性もあるため、EUCで様々な処理を行い、必要に応じて入出力の段階で変換しています。基本的にEUCでは文字化けが起こりにくいことと、豊富な歴史的産物が使えるからです。
★Perl正規表現雑技 ( http://www.din.or.jp/~ohzaki/regex.htm )
★Perlメモ ( http://www.din.or.jp/~ohzaki/perl.htm )
また、テキストエディタですが、さすがにメモ帳は勧めていません。
・元に戻る回数が限定されている。
・改行コードの違い,タブ,全角と半角の文字の区別が付かない
・検索・置換が、不便
・正規表現が使えない
・様々な文字コードを扱えない
そのため、特に初心者には「テキストエディタ EmEditor - EmEditor Free ( http://jp.emeditor.com/modules/download2/rewrite … )」などの高機能テキストエディタを勧めています。初心者には必需品です。リンク先の下のほうにfree版へのリンクがあります。
当然、UTFであってもBOMをつけないで保存できます。
No.5
- 回答日時:
#2 です。
すいません、ちょっと勘違いをして、#2では読込むテキストではなく、Perlスクリプト自体の文字コードのつもりで書いてました。
> また、文字コードについて実は、まだあまり理解できていないのですが、PERLでスクリプトを書く場合、
> use utf8;
> は付けずに書いております。これは、書いた方が良い物でしょうか?
他の方も指摘されている通り、スクリプト自体をutf8で書く場合でなければ、付けてはいけません。詳細は#2に書いたサイトを見て下さい。
が、スクリプト自体をutf8で書き、 use utf8; を付けて、内部表現と入出力のエンコードを意識しつつ処理するが無難だと思います。
No.3
- 回答日時:
個人的には「文字化け」は無視しているし (<ぉぃ) 日本語と英語が使えれば (少なくとも当面は) 十分なので, 「Unicode にする」モチベーションがないんですよね.... ということで, Windows では主に shift-jis. Unix とかを考えてもむしろ ISO-2022-JP.
perl における utf8 プラグマは「スクリプトが UTF-8 で書かれている」, つまり識別子や文字列定数 (正規表現を含む) が UTF-8 で書かれていることを示すためにあり, またそれ以外の目的で (ってなんだろう) use してはならないということになっています. だから識別子や文字列定数が ASCII に含まれる文字のみであれば utf8 を use する必要はありません. 特に, 「読み込むテキストの文字コード」とは無関係です.
あと, Windows で UTF-8 なテキストに対し BOM をつける件ですが, これについては個人的には Microsoft を非難する気にはなれないです. そもそも (日本の) Windows では shift-jis が使われていたわけですから「何らかの方法で UTF-8 なテキストを区別したい」というのは自然な考え方ですし, そのような状況下で UTF-8 なテキストに (Unicode で書かれていることを示すマークとして) BOM をつけることは Unicode Consortium でも認められています. 実際, FAQ にも「プレーンテキストであることは分かっているが符号化方法が不明なときには BOM を使うことができる」と書かれています.
この質問の文章だけでは正確なところが分からないんだけど, ひょっとするとあなたの作ったプログラムの方で「BOM のついた UTF-8 な設定ファイル」を許してあげる方がいいのかもしれません. 特に, Windows 環境で動かすプログラムであれば
・BOM があれば UTF-8
・なければ shift-jis
と解釈するのがよいのかも.
No.2
- 回答日時:
以前は EUC_JPで書くことが多く、状況によって Shift_JIS だったりしましたが、Perl5.8 以降は「use utf8;」を付けて UTF-8 で書くことがほとんどですね。
Perl5.8 以降は文字列の扱いが変わって内部ではUTF-8として扱うことになっているので、UTF-8で書くのが無難だと思いますよ。
http://hikoboshi.org/perl/utf8.html
http://www.rwds.net/kuroita/program/Perl_unicode …
上記のサイトに有るとおり、入出力時には内部表現、つまりutf8フラグ付きのUTF-8文字列との変換を行なうのがセオリーだと思います。
それから、BOMに関してですが、本来UTF-8にBOMは不要なので、マイクロソフト系のソフトウェアでUTF-8のBOMが必須となっているのは、そちらの方が問題ですね・・・。
http://ja.wikipedia.org/wiki/UTF-8#.E3.83.90.E3. …
回答いただきありがとうございます。
UTF-8で良いのですね。安心しました。
また、文字コードについて実は、まだあまり理解できていないのですが、PERLでスクリプトを書く場合、
use utf8;
は付けずに書いております。これは、書いた方が良い物でしょうか?
とりあえず、不具合無く動いて居るように見えています。
BOMについて、Wikipediaへのリンクありがとうございます。よく使うOSはWindowsが多く、WindowsではBOMが無い場合動かないこともあるのですね。とても勉強になりました。
しかし、UTF-8でややこしいことが無くなったという印象を持っていたのですが、なかなかうまくいかない物ですね。
No.1
- 回答日時:
UTF-8
>色々試行錯誤して、3日ほど悩んだ結果、相手のパソコンで編集(Vista)すると、BOMというものが付くことが分かり、
メモ帳を使わなければいいのでは?
回答いただきありがとうございます。
それはそうなのですが、パソコン初心者(Wordとメモ帳の違いが分からない)の方に、手軽に編集して貰うには、拡張子を.txtにしてメモ帳で編集できるようにするのが最も負担が少なく、これ以外の手段がないところなのです。
また、ややこしい問題は、UTF-8なら全て解決していたと思っていたのですが、思わぬ落とし穴があったという気がしています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
デバッグ情報が文字化けする
-
【文字コード】外見上は全く同...
-
MFCのコントロールにUTF-8の文...
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
住宅にカナを入力する際に丁目...
-
英数字のみ全角から半角に変換
-
各項目がダブルクォーテーショ...
-
Excel VBAでPDFファイルをMicro...
-
Excelについて質問です。 セル...
-
VBA 置換文字がみつからない時
-
EXCELからCSVにすると余計なカ...
-
csvデータ ダブルクォーテ...
-
VBA 文字に半角が含まれて...
-
CSVの定義
-
IEからEdgeへの移行に伴うIMEの...
-
マクロを使ってフォルダー内に...
-
word差し込み印刷 半角カタカ...
-
WORDで改ページすると時々グレ...
-
[VBScript]バイト長の判定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perl でエラー:Wide character...
-
【文字コード】外見上は全く同...
-
MFCのコントロールにUTF-8の文...
-
UTF-16からUTF-8への変換
-
perlについての質問
-
substrでutf8の日本語文字を先...
-
文字コードについて \\x{53d6}...
-
キーワード抽出がうまくいかない
-
【LaTeX】pBibTeXでのエラーの...
-
CGI.pmで日本語をURLエンコード...
-
デバッグ情報が文字化けする
-
ソース中の文字列と、DBから取...
-
perl 5.6 とperl 5.8 の内部形...
-
JcodeモジュールとEncodeモジュ...
-
Perlで、文字の出現回数を調べ...
-
Jcode.pmでconvertできない
-
EC-CUBEでの文字化け
-
UTF-8のPerlから、UTF-8、EUC、...
-
MT::Mailでメールを送信すると...
-
{ブロック}の外でのみ use ut...
おすすめ情報