• 締切済み

特殊文字 '?' を出力したい

特殊文字 '?' を出力したい 特殊文字 '?' を出力したい DB(Postgres)文字コード:UTF-8にて保存されている'?'という特殊文字を 含んだ文字列をcsv出力しようとして NKF.nkf("-W",str) としようとしたところ、文字変換コードが上手くいかず 他の文字は問題なく表示されますが '?'が削除された状態で出力されてしまいます。 皆様、アドバイスの程お願い致します。 ========================================== 環境: ========================================== OS: CentOS5.4 Ruby: 1.8.6 Postgres:8.1.0 投稿日時 - 2010-09-28 16:22:21

  • Ruby
  • 回答数3
  • ありがとう数4

みんなの回答

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

>UTF-8にて保存されている'?'という特殊文字を 元は特殊文字だったのかもしれませんが、ここでは普通の疑問符(文字コード0x3F)として表示されています。元の文字のUTF8での文字コードを16進数で書いてください。 また、変換先の文字コードは何ですか? その特殊文字がUTF-8に含まれていても変換先の文字コードには含まれない文字ならば、変換できないのは当然なので。

回答No.2

No.1です。 他の文字列が表示されているので、出力エンコードの問題ではなさそうですね。 どうしてもうまくいかないなら、Postgre側で'?'を使わないコードに置換してからrubyで再置換すると言う荒業を使えばどうにかなりますが。

回答No.1

Postgres使ったことがないのですが、回答者がいないようなので。 まず、ruby側で p str を使って'?'が入力されているか確認してみてください。 入力されていれば、?を含む文字列が出力されるはずです。 入力されているのであれば、 $KCODE= 'SJIS' NKF.nkf("-Ws",str) $KCODE= 'EUC' NKF.nkf("-We",str) 等で、出力エンコードを目的のキャラクタセットに設定すると、出力できると思います。 '?'が入力されていないのであれば、接続の問題と思いますので、以下のサイトを参考にPostgres側でキャラクタセットの設定を行ってみてくさい。 http://www.postgresql.jp/document/pg813doc/html/multibyte.html Postgres側で設定を正しく行っているのに入力されない場合は、接続ドライバの問題と思いますので接続ドライバを書いて再質問すれば、誰か答えてくれるかも。

関連するQ&A

  • 特定文字での文字化け

    DB(oracle)から抽出したものをPerl5でcsv出力しているのですが、特定文字で文字化けが起こってしまいます。 特定文字というのが、シフトJISの「拡張文字」と言われているものにあたるらしく、 0xED40~0xED9Eとか0xFA40~0xFA9Eとかです。 0xED40→ス、0xED9E→シ、0xFA40→。、0xFA9E→.となってしまいます。(文字を出したかったのですが、表示されなかったので文字コードにしました。) $strをDBより抽出した文字列として jcode::convert( \$str, "euc" ); : :(文字列の区切り処理) : jcode::convert( \$str, "sjis" ); ということをやっています。 以前、 &jcode'convert( $str, "euc" ); : :(文字列の区切り処理) : &jcode'convert( $str, "sjis" ); とやっていたのですが、この場合、 「半角カナ+文字コードが7cを含む文字」 が文字化けを起こしていました。 これを修正するために前者のような修正をしたのですが、 間違っているのでしょうか? すみませんが、よろしくお願いします。

  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • Linuxで標準出力したファイルの文字コードついて

    Linuxで2つのディレクトリの内容をtreeコマンドでそれぞれファイルに出力して、 その2つのファイルをdiffで比較して、その結果をファイルに出力するシェルを作成しました。 比較対象のディレクトリの内部には日本語でファイル名やディレクトリ名を付けているものもあります。 このシェルを手動で実行してファイルに出力された内容を確認すると、 日本語であるべきところは日本語で出力されています。 nkfコマンドでファイルの文字コードを確認すると「UTF8」となっています。 しかし、cronにてこのシェルを実行してファイルに出力された内容を確認すると 何故か日本語の部分が化けて(ASCIIのようです)しまいます。 nkfコマンドでファイルの文字コードを確認すると「ASCII」となっていました。 cronで実行した場合にも出力するファイルの文字コードを「UTF8」にしたいのですが どいうすればよいでしょうか? どなたかご教授願います。 よろしくお願いします。

  • postgresからmysql

    postgresのDBをmysqlのDBにインポートすることは可能でしょうか? postgres環境文字コードUTF-8 mysql環境文字コードEUC-JP

  • ファイル読み込み時の文字列比較が上手くいきません

    よろしくお願いします。 cgiの勉強中なのですが、文字列の比較が上手くいかずに困っています。 プログラム中に記述した日本語は問題なく同じ文字として比較されるのですが、 ファイルから文字を読み込んだ日本語を比較させようとすると上手くいきません。 以下のプログラムでは4箇所から「yes」と返ってくるのが理想でしたが、 後半の2箇所からしか「yes」と返ってきませんでした。 文字コードの問題かとも思い、NKF等で変換してみたり試してみましたが上手くいきませんでした。 また、どのファイルもUTF-8に統一されているのでファイルの読み込み時に文字コードの変換は必要無いのではないかとも思っています。 使用しているファイルは以下の3ファイルとなり、同一フォルダに入れています。 プログラム中で日本語を使用したかったので、どのファイルも文字コードはUTF-8で保存しています。 question.rb  :メインプログラム Unit_module.rb :メインから呼び出すモジュール question.txt  :文字列の入ったテキスト(最後は改行していません) rubyのバージョンは1.9.3p125を使用しています。 独学ですので周囲に訊く事も出来ずにいます。 何が問題で文字列の比較が上手くいっていないのでしょうか? 以下は各ファイルの内容となります。 ---------------question.rb----------------------------------------- #! /usr/local/bin/ruby # -*- encoding: utf-8 -*- #モジュール読み込み require "./Unit_module" include Unit #HTML作成 print "Content-Type:text/html;charset=utf-8\n\n" print <<EOF <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> EOF str_test = "" #ファイル読み込み時の日本語の比較 f = open("./question.txt", "r") f.each{|line| str_test = line if str_test == "東" then print "yes" end test(str_test) } #プログラム中に記述した日本語の比較 str_test = "東" if str_test == "東" then print "yes" end test(str_test) print "</body></html>" -----------Unit_module.rb------------------ # -*- encoding: utf-8 -*- module Unit def test(str_test) if str_test == "東" then print "yes" end end end -----------question.txt--------------------- 東 --------------------------------------------

    • ベストアンサー
    • Ruby
  • 文字列を複数の段落に分割して出力

    次のようなことを実現したいのですが、どのようなアルゴリズムになりますか? ------ 文字列が複数ある。各文字列は改行コード(\n)で区切られた複数行の文字列からなる。 string[STR_NUM]; // STR_NUM: 文字列数 これらの文字列をN段落に分けて出力したい。 ただし文字列の途中行で段落を変えない。 各段落の行数は最適値を求める。つまり、各段落に最も均等になるように振り分ける。 N=2でSTR_NUM=4の場合は次のような感じで出力する。 文字列1文字列1      文字列3文字列3文字列3 文字列1文字列1文字列1  文字列3文字列3 文字列1文字列1      文字列3文字列3文字列3 文字列1          文字列3 文字列2          文字列3文字列3文字列3 文字列2文字列2文字列2  文字列4文字列4               文字列4文字列4               文字列4文字列4文字列4               文字列4 全体で15行あるので、均等に割ると1段落は8行となり、詰めて出力すると文字列3の2行目で改段落されることになります。そうならないように文字列3は2段落目の頭から出力します。 求めたいのは、Nとstring[0]~string[MAX_STR-1]が与えられたときの「1段落あたりの最大行数」と「各段落に出力する文字列」です。 各段落に出力する文字列は結合した状態で、かつ最大行数に合わせるように末尾に改行コードを必要数追加するものとします。 1段落あたりの行数の制限はありません。与えられた文字列によって最適な行数を求めます。

  • 文字の数え方

     use utf8; を宣言すると、内部に記述されるリテラルにutf8フラグが立てられて、例えばlengthを用いて文字数を数えた場合に、多バイト文字であっても1文字を1とカウントしてくれるそうです。 次のコードでは、文字列の文字数を数えてみました。。   #! /usr/bin/perl   use utf8;   use Encode;   my $str="最初にUTF-8で表示します。次にshift-JISで表示します。";   print length $str;   print "\n";   $str=encode("shiftjis",$str);   print length $str;   print "\n"; 実行結果は以下の通りです。   33   52 文字列がUTF-8の場合は、シングルバイト文字、多バイト文字関係なく1文字で計算するので33文字です。これに対してshift-JISの場合は、多バイト文字を2文字でカウントするので52文字になります。 なるほど。 しかし、次がよく分からないんですけど、   use utf8; をコメントではずすと、その実行結果は以下のようになりました。   71   76 これはどういう計算なのでしょうか?

    • ベストアンサー
    • Perl
  • mb_detect_encoding()関数について

    かなり初歩的な質問かもしれませんが、とあるサイトを参考に、以下のスクリプトを作って文字コードをEUC、 改行コードをLFにして保存し、実行しました。 <?php $str="PHP練習"; print mb_detect_encoding($str); ?> これを実行した結果は、 UTF-8でした。 てっきり保存した文字コードが出力されると思ったんですが違いました。ためしに今度は「$str="PHP練習";」の部分を「$str="PHP";」に してみたらASCIIと出力されました。 さらに今度は「mb_detect_encoding($str);」の部分を、 「mb_detect_encoding($str,"UTF-8");」にして実行したら、 UTF-8と出力されました。 「mb_detect_encoding($str,"SJIS");」にして実行したら、 SJISと出力されました。 あといろいろ$strの中の文字を変えたりしてみましたが、 たまに何も出力されないときもありました。 サイトの説明を見たら、「mb_detect_encoding()関数は、文字列のエンコーディング形式を検出します」と書いてありました。 この「文字列のエンコーディング形式」というのは何によって決まるのでしょうか?

    • 締切済み
    • PHP
  • 文字コードの変換について教えてください

    文字コードUTF-16、Little-Endian、改行コードCR/LF、BOMのデータを読み込み、 シフトJISに変換して処理するため、次のようにしたのですが、 中ほどのデータが消えてしまいます。 何か間違っていますか? require 'nkf' ... text = file_in.read text_shiftjis = NKF.nkf('-sW16L',text)  p text_shiftjis #確認用出力

    • ベストアンサー
    • Ruby
  • 拡張文字のチェック

    ファイルから文字列データを読み込んでDBに格納する再に 文字列データ内に第二水準及び、拡張文字が入っていたらNGを出すというチェックをしたいのですが、うまいこといかずに詰まってしまいました。 今のところ正規表現で該当文字をSJISのコードで指定してるのですが思ったとおりになりません。 環境は 読み込みファイルはSJIS、DBはEUC PHP4.3.9 DBはPostgresです。 よろしくお願いいたします。

    • 締切済み
    • PHP

専門家に質問してみよう