数値文字参照で文字に変換できない問題

このQ&Aのポイント
  • HTMLファイル内の日本語が数値文字参照で書かれている場合、数値文字参照を文字に変換するプログラムを作成しましたが、一部の文字が変換できません。
  • 特に数値文字参照「-」(マイナス記号)は変換できないようです。
  • 文字をコピーしてメモ帳にペーストすると、ブラウザ上と同じマイナス記号が表示されますが、原因は不明です。
回答を見る
  • ベストアンサー

数値文字参照「-」が文字に変換できない。

HTMLファイル内の日本語が数値文字参照で書かれていて、 それを普通の文字に変換したいと思い、以下のプログラム で数値文字参照を文字に変換してみました。 文字コードはシフトジスです。 use Encode; use encoding 'shiftjis';binmode(STDERR, ':raw :encoding(shiftjis)'); while (<STDIN>) { my $line = $_; $line =~ s/&#([0-9]{1,5});/chr($1)/eg; $line =~ s/&#[xX]([0-9A-Fa-f]{4});/chr(unpack('S', pack('H4', $1)))/egi; print $line; } ほとんどの文字はテキストエディタでも見える文字に変換されたのです が、数値文字参照「-」(ブラウザで見るとマイナス記号?)は 変換できませんでした。 また、ブラウザ上でこの文字をコピーしてメモ帳にペーストしてみると ちゃんとブラウザ上と同じマイナス記号?が表示されます。 原因が分かるかたがいましたら回答をお願いいたします。

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

原因ですが、Unicodeと他のコードとの変換のときに用いる変換表の混乱によるものです。 詳しくは、 Unicode ff0d あたりをキーワードに検索してみてください。 回避策ですが、 use encoding 'shiftjis' を use encoding 'cp932' に変更してみてください。 use encoding 機能は使わないほうが良いと思いますが これはまた別の話ですので割愛します。

gle_gle
質問者

お礼

use encoding 'cp932'; に変更してみたら、ちゃんと変換されました。 これから変換表の混乱について調べてみようと思います。 ありがとうございました。

関連するQ&A

  • EUC_JPにない文字のshiftJISからの変換処理

    http://okwave.jp/qa757480.html ここにある質問と同じ状況になっています。 shiftJISの文字列をEUC_JPに変換したところ、 invalid byte sequence for encoding "EUC_JP" というエラーが出ました。 EUCにない文字なので変換が出来ないのはわかるのですが、ではその場合どのような処理が妥当でしょうか。 テキストデータから文字を取り込んでいるので最初から文字をEUC_JPやUTF-8で文字列を作ることができません。 EUCにない文字はどうやっても変換できないので代替文字もしくは記号を置くことで解決しようかと思ったのですが、そうするとどの文字がshiftJISにあってEUCにないかの一覧がないとどうしようもないかと思います。 この場合はどうするのが良いかアドバイスいただけませんでしょうか。

    • ベストアンサー
    • Perl
  • Perlの文字コード変換について

    ActivePerl-5.14を使っているのですが、文字コードの変換はどのようにすればいいのでしょうか。 ローカル環境で動かしているのですが、Shift-JISのテキストを読み込んで、EUC-JPに変換したいと思っているのですが、 今まで5.8を使っていたので、Jcodeを使って、&Jcode::convert(\$txt,'euc'); としていたのですが、5.14ですと use Jcode;  の時点でエラーになってしまいます。 use Encode; を使って、 from_to($txt, 'shiftjis', 'euc'); としてみましたが、 from_to($txt, 'shiftjis', 'euc'); のところでエラーになってしまいます。 ActivePerl-5.14ですと、どのように文字コードの変換をすればいいのでしょうか。 どなたか教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perlの文字コード変換についての質問です。

    Perlの文字コード変換についての質問です。 ホームページ全体は、UTF-8で作成されています。 そのため、$qsは、どうも、S-JISのようなので、UTF-8に変換して URLデコードさせたいのですがうまくいきません。 文字化けしないで、UTF-8で作成されたページに表示させたいのですがどうすればよいでしょうか? 宜しくお願い致します。 ------------------------------------ $qs = $ENV{'QUERY_STRING'}; use Encode::Guess qw/ shiftjis /; use Encode qw/ decode /; $enc = guess_encoding ( $qs ); if ( ref $enc ) { $utf8 = decode ( $enc->name , $qs ); } $qs =~ tr/+/ /; $qs =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; print "$qs";

    • ベストアンサー
    • Perl
  • 「3つの数字パターンをひとつの記号に変換する」ことをエクセルで行いたい

    「3つの数字パターンをひとつの記号に変換する」ことをエクセルで行いたいです。 例)A1、A2、A3のセルにそれぞれ「-1」「0」「5」という数字があります。この数字の並びを参照して、次の条件でB3のセルに文字で置き換えたいのですが、どのようにすればよいでしょうか? 条件1/A1~A3までの数値のうちマイナスの数値が0~1個の場合,B 条件2/A1~A3までの数値のうちマイナスの数値が2~3個の場合,S 説明不足な点があるかもしれませんが、よろしくお願いいたします

  • カンマの含まれる文字列の数値変換方法について

    VB.NETでプログラミングしています。 String型の文字列を Double型の数値に変換するときに 一般的にはVal関数を使いますが、 カンマが含まれる文字列"111,111"を 数値変換したい場合には単純にVal関数を 使用しただけではうまくいかないようです。 上の例で数値変換すると"111"になってしまうようです。 そこで質問なのですが、 何か簡単にできるうまい方法はないでしょうか? 関数があればご教示ください。 以下、Val関数の説明の抜粋です。 解説 文字列中に数字以外の文字が見つかると、Val 関数は読み込みを中止します。円記号 (\) やカンマ (,) など、通常は数値の一部と見なされる記号や文字も、Val 関数は数値として解釈しません。

  • ある文字列から数値だけを取り出したいのですが

    EXCEL初心者です EXCEL2000で ある文字列から”-(マイナス)”記号以降の 数値だけを取り出したいのですが、よい方法がわかりません、 例) 12.8-20.0→20.0 13.5-15.3→15.3 1.5-5.6→5.6

  • 文字実体参照が勝手に変換されてしまう

    簡単な問合せフォームを作成中に文字実体参照に変換した文字が、元に戻されてしまい困っています。簡単なサンプルを作成してみましたが、以下の様な状態です。 1.入力フォームを持ったHTMLに 「<>と&lt;と&gt;」 と入力し、xxx.cgiに渡します。 2.xxx.cgi内で入力文字列を取得し、文字実体参照に変換後<hidden>で値を保持、再度xxx.cgiに<hidden>の文字列を渡すようにします。この時点で入力値は 「&lt;&gt;と&amp;lt;と&amp;gt;」 となります。 3.再度xxx.cgiが呼ばれると、文字実体参照に変換する処理が行われる為、入力値が 「&amp;lt;&amp;gt;と&amp;amp;lt;と&amp;amp;gt;」 となるはずですが、 「&lt;&gt;と&amp;lt;と&amp;gt;」 となってしまいます(変換処理が行われているはずなのに変換されていない)不思議に思って変換前のCGIの引数を確認してみると、 「<>と&lt;と&gt;」 と文字実体参照が元に戻されてしまっています。 ちなみに文字実体参照の変換処理は$valueに対象の文字が入っているとして以下の方法で変換しています。 ---------- $value =~ s/&/&amp;/g; $value =~ s/"/&quot;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\n/<BR>/g; ---------- こういった現象についてでも何か分かるようでしたら宜しくお願いします。

    • ベストアンサー
    • Perl
  • 全角空白での文字列分割について

    教えてください。 以下のような文字列で、全角空白をキーに2つに分割したいと考えています。 テストテキスト テストテストテスト スクリプトの文字コードはshiftJISで、分割対象の文字列もshiftJISです。 use encoding "shiftjis";  としてます。 ($t1,$t2) = split(/ /, $t); として試してみましたが、やはり無理でした。 何か良い方法がありましたら、教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 「数値文字参照への変換するソース」が知りたい

    XFormsとやらを実験してみたくなり X-Smilesを用いて見た。 事前にXFormsとは関連の無い 自分が書いたソース (拡張子.xml,Content-Type:application/xhtml+xml) を読み込ませたところ UTF-8で書いたものが、 ISO-8859-1で読み込まれた。 (ただし、DOCTYPE宣言があるとエラー。) なお、この際、ソースでは、 日本語の部分は数値文字参照に変換されていて 正常に見られた。 さて、 XFormsで送られてきたデータをperlによるcgiに送った。 多分XHTMLやHTMLの書式と同じだと思います。 (例) http://hogehoge.net/hoge.pl?Name=himajin;Password=karipassword (XForms 1.0 仕様書にXMLデータとして受け渡される・・・みたいなこと書いてあった気がするんだけど いい加減に読みすぎたかな・・・?) 上記xmlでは日本語が自動的に変換されていたので formから送られてきたデータをURLデコードして そのまま表示させようとしたが ---------------------- Invalid byte 1 of 1-byte UTF-8 sequence.java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence. at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source) (以下略) ------------- というエラーが出た。 よくわからないが(汗)ひょっとしたら 自力で数値文字参照にしなければならないのかも・・・ と予測しています ソースを書いていただけないでしょうか? 探してもなかなか見つからないです

    • ベストアンサー
    • Perl
  • SJIS→UTF-8の文字コード変換

    Perlで、SJISの16進で表記された文字があるのですが、それがうまく表示できません。 Unicodeの16進文字コードだとうまく表記できるのですが…。 以下がスクリプトです。 以下の場合だと。(句点)がSJISだと0x8142で、 その16進文字列を表示したいのですが、実行結果にあるエラーが出てしまいます。 Unicodeだと。は0x3002なのですが、うまく表示できています。 すみませんがよろしくお願いします。 ---------------------------------------- # このファイルの文字コードはSJIS # 改行コードはLF # # 。 SJIS 0x8142 # Unicode 0x3002 # use Jcode; use encoding "sjis"; $a = 0x8142; $a = Jcode->new($a, "sjis")->utf8; printf("句点の表示…%c\n",$a); printf("句点の表示…%c\n",0x3002); ---------------------------------------- 実行結果 "\x{8142}" does not map to shiftjis at test.pl line 14, <DATA> line 846. 句点の表示…\x{8142} 句点の表示…。

    • ベストアンサー
    • Perl