※ ChatGPTを利用し、要約された質問です(原文:[perl5.8] SJISから読み込んだ~と)
[perl5.8] SJISから読み込んだ~の文字列マッチングで問題が発生しました
このQ&Aのポイント
sjisで書かれたファイルsjis.txtに一文字だけ書いて、utf8で記述したperlスクリプトで文字列マッチングをした際に問題が発生しています。
具体的な問題の発生原因や解決方法について、お知恵をお貸しください。
WAVEDASH問題に起因していると考えられますが、詳細はまだ理解できていません。
sjisで書かれたファイルsjis.txtに"~"と一文字だけ
書いて、それをutf8で記述した以下のperlスクリプト
で読込み、文字列マッチングをしたのですが、うまく
いきません。(ちなみにソース中blockB部分を有効に
し、blockAをコメントアウトするとうまくいきます)
#=== match.pl ===============================
#!/usr/bin/perl
use encoding 'utf8';
use open IN => ":encoding(Shift_JIS)";
use open OUT => ":encoding(utf8)";
binmode STDOUT, ":raw:encoding(shiftjis)";
# === blockA ===
open(IN, "<sjis.txt");
@lines = <IN>;
close(IN);
# ==============
# === blockB ===
# $a = "~";
# push(@lines, $a);
# ==============
for(@lines) {
if (/~/) {
print "WAVEDASH発見\n";
}
}
#=============================================
※いわゆるWAVEDASH問題に起因してそうだな、
というのはわかりますが、具体的に何が起きて
いるのかが理解できません。
原因や、どうすればこの問題を解決できるか、
ご存知の方、お知恵をお貸しください。
お礼
なるほど! BLUEPIXYさんに書いて頂いたキーワードで ぐぐり直した結果、完全に理解することが できました! SJISではFullWidthTilde(~)とWaveDash(〜)を 同一のものとしていましたが、unicodeでは、 違う文字として管理しているんですね。 確かにFullWidthTildeは左肩があがっている波 の様な記号ですが、WaveDashは逆肩が上がって いて、別の記号ですね。 で、Perl5.8が、SJISの~を変換する時に、 間違って(?)WaveDash(〜)の方に変換して しまっているため、僕が書いたソース中の 文字列マッチングのパターンとして記述した ~とはマッチングしなかったわけですね^^ ・参考文献 http://ja.wikipedia.org/wiki/%E5%AE%9F%E4%BD%93%E5%8F%82%E7%85%A7 また、&#数字という表現は、文字コードを 直接指定する記述法ですね。 ・参考文献 http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A3%E3%83%AB%E3%83%87 今までどの過去ログを見ても理解できません でしたが初めてスッキリと理解できました! BLUEPIXYさん、本当にありがとうございましたm(__)m