質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2510閲覧

Unicodeエスケープシーケンス

witchy

総合スコア74

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2018/10/26 05:02

rubyからCGIを用いて、SQLiteへ接続し、文字列データをselectコマンドを使って取得したのですが、取得した文字列がユニコード表記(例\u30af)であり、これをUTF8に変換したいのですが、それができず悩んでいます。

ruby

11 hash = Hash.new #ハッシュ宣言 22 i=0 33 db=SQLite3::Database.new("test.db") #データベース接続 44 db.transaction do 55 db.execute('select * from votes;') do |key| #select文で取得した文字列をkeyに格納 66 if hash.has_key?(key) #ハッシュのキーにkeyの値が使用されていたら、そのバリューの数値を+1する。 77 hash[key]+=1 88 else #keyの値が使用されていなかったら、バリューの値を1とする。 99 hash[key]=1 1010 end 1111 i=i+1 1212 end 1313 end 1414 db.close 1515 1616 hash.each do |key,value| #ハッシュの各キーとバリューを、htmlを用いて表示する。 1717 print <<EOF 1818 <li>#{key}:#{value}</li><br> 1919 EOF 2020 end

5~14行目に以下のようにpackメソッドを利用しても、上手くいかず、今度はweb上には何も表示されなくなりました。

ruby

15 db.execute('select * from votes;') do |key| #select文で取得した文字列をkeyに格納 26 key2 = key.gsub(/&#x([\da-fA-F]+);/) { [$1].pack('H*').unpack('n*').pack('U') } 37 if hash.has_key?(key2) #ハッシュのキーにkeyの値が使用されていたら、そのバリューの数値を+1する。 48 hash[key2]+=1 59 else #keyの値が使用されていなかったら、バリューの値を1とする。 610 hash[key2]=1 711 end 812 i=i+1 913 end 1014 end 1115 db.close

考えてみたほうが良い手法や、修正すべき点等ありましたら、教えていただけますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

key.gsub(/&#x([\da-fA-F]+);/) { [$1].pack('H*').unpack('n*').pack('U') }自体は正しそうな気がします。

shell

1$ irb 2irb(main):001:0> key="a&#x307b;c&#x3052;d" 3=> "a&#x307b;c&#x3052;d" 4irb(main):002:0> key.gsub(/&#x([\da-fA-F]+);/) { [$1].pack('H*').unpack('n*').pack('U') } 5=> "aほcげd"

…と思ったんですが、「ユニコード表記(例\u30af)」ということは、ひょっとして"a&#x307b;c&#x3052;d"ではなくて"a\u307bc\u3052d"みたいな文字列が返ってくる、ということでしょうか? であれば、

ruby

1key2 = key.gsub(/\u([\da-fA-F]{4})/) { [$1].pack('H*').unpack('n*').pack('U') }

みたいにする必要がありそうです。

とりあえず、keyとkey2をログ等に出力して調べてみるといいんではないかと思いました。

投稿2018/11/02 16:05

takahashim

総合スコア1877

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

witchy

2018/11/02 20:32

ご回答ありがとうございます!! 上のコードの5行目で、データベースからselect文を用いて取得した文字列を変数keyに格納しているとコメント表記していたのですが、正確にはselect文で取得できるのは、文字列の配列でした。そのため、6,7,9行目で変数keyを利用するには、配列表記でkey[0]としなければなりませんでした。この修正後には、正しく出力ができました。 また、頂いた修正案を元にコードを変更し、試してみようと思います。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問