- ベストアンサー
全角数値検出の問題解決法
- 全角数値がエラー処理を引き起こす問題について解説しています。
- 正規表現とUTF-8の使用が全角数値の検出に影響を与える状況を説明します。
- 変数間の全角数値検出の差異について、原因を探る方法を考察します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>※ローカル環境だと「use utf8」をコメント化すると全角数値を検出し、if文内の処理が行われる ソースコードを「UTF8」の文字コードで保存していないのが原因でしょう。 「use utf8」のプラグマの意味は「ソースコード内の文字列定数はUTF-8で書かれている」です。 ソースコードをシフトJISやunicodeで保存している場合、意図した動作をしません。 pealコンパイラは、use utf8と書かれていると、ソースコードの文字列定数をUTF-8で書かれていると解釈し「UTF-8から内部コードに変換する」という処理を加えてコンパイルします。 しかし、書かれている文字列定数がシフトJISだったりunicodeだったりすると、内部コードに変換せず(変換に失敗し)「変な値の半角文字列」として、何の変換もせず、そのままコンパイルします。 その結果、正規表現などが正常に機能しません。 >また、どうアプリにて変数$test, $test2の両方に全角数値の「1」が入っているにもかかわらず >片方は、全角数値として検出されもう片方は全角数値として検出されないという現象もありまして 片方は、正しく内部コード化された全角文字の「1」が格納されていて、もう片方は、内部コード化されていない環境依存の文字コードで表現された、printすると「1」が表示されるが、内部コードの「1」とは異なる文字列が格納されています(例えば、シフトJISの「1」が入っている、など) この2つの文字列を比較すれば「違う文字列」と判断されるし、片方は全角判定、もう片方は半角判定されます。 詳しくは https://www.futomi.com/lecture/japanese_utf8.html#gsc.tab=0 などを良く読んで下さい。 「なんの為にそう記述し、そう記述した効果は何なのか」を良く理解した上でソースコードを記述しましょう。
その他の回答 (1)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
追記。 Windows環境でPerlでプログラミングしている場合、Power shellなどのコンソールは、入出力がShift_JISコードになっています。 ファイルからの入出力や、printなどのコンソール出力は、Encode::encode、Encode::decodeで「シフトJIS変換」を行う必要があります。 また、ソースコードを記述している「メモ帖」なども、無指定の場合、漢字をシフトJISで保存します。 なので、ソースコードにuse utf8と書いて、文字コードをシフトJISのままソースファイルを保存すると、Perlはソースコードを正常にコンパイルできません。メモ帳などで保存する際にはUTF-8でソースコードを保存しないとなりません。 このあたりの「文字コードの扱い」が「Perlでの最難関」になり、ここで挫ける人が多発しています。
補足
ご回答ありがとうございます。 ソースコードはutf8で保存されています。 >>片方は、正しく内部コード化された全角文字の「1」が格納されていて、もう片方は、内部コード化されていない環境依存の文字コードで表現された、~ 両方の変数の値はsjisで保存された1つのファイルに定義されたものになります。 ファイルから読み込んだ値を「Encode::decode('cp932', $test)」で内部エンコーディングに変換して「if($test =~ /\D/) 」の判定をしています。 それでも全角の'1'の検出できるかできないかの差が生じてしまうようです。 尚、両方の変数を「if($test1 eq $test2)」にて比較してみましたが同じ値と判定されました。