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

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

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

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

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

Q&A

解決済

6回答

451閲覧

テキストファイルに文字コードで記述されたデータを日本語に変換して出力したい

mtdsnsk

総合スコア789

Ruby

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

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

0グッド

0クリップ

投稿2018/03/09 08:24

ruby

1moji = "\u97F3\u9806(\u6607\u9806)" 2puts moji

上記のコードだと自分の環境では"音順(昇順)"と出力されて、これは期待通りなのですが

"\u97F3\u9806(\u6607\u9806)"

テキストファイルに上記のように記述して、このファイルを読み込んでrubyのプログラムで出力した場合、そのまま"\u97F3\u9806(\u6607\u9806)"となります。
文字コードを指定しても同じです。

ruby

1path = "テキストファイルのパス" 2File.open(path) do |f| 3 f.each_line do |line| 4 puts line.force_encoding("utf-8") 5 # 出力 "\u97F3\u9806(\u6607\u9806)" 6 end 7end

ファイルに書き込まれたコードポイントの文字列を

ruby

1puts 0x97F3.chr("UTF-8")

のように文字を分解し一文字ずつ出力すれば期待通りの動作にはなるのですが、もっと良い方法がないかと思い質問しました。

ruby 2.2.4を使用しています。

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

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

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

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

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

maisumakun

2018/03/09 08:44

「どのような理由で」そういった処理をしたいのでしょうか。
mtdsnsk

2018/03/09 09:34

yamlファイルに日本語が"\u97F3\u9806(\u6607\u9806)"形式で記述されているのですが、その文字列が何かを調べるためです。具体的にはUnityのシーンファイルの中身でテキストとして使われている日本語を精査するためにyamlファイルを解析するためです。
guest

回答6

0

JDKがインストールされていれば、以下のコマンドが使えます。

bash

1$ echo "\u97F3\u9806(\u6607\u9806)"|native2ascii -reverse 2音順(昇順)

なお、JDK1.9では廃止された模様…

投稿2018/03/09 08:50

編集2018/03/09 08:53
hichon

総合スコア5737

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

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

mtdsnsk

2018/03/09 09:26

ありがとうございます。JDKをインストールした環境で試して見たいと思います!
KSwordOfHaste

2018/03/09 10:34

JDK9からresource bundleのデフォルトエンコーディングがUTF-8になったから廃止になったのですね。 ちなみにJDK9からはJDK1.9とは言わないような気がします。
guest

0

ベストアンサー

ruby

1line = '\u97F3\u9806(\u6607\u9806)' 2puts line 3# 以下だと式展開を埋め込まれると厄介 4# puts eval "%\0#{line}\0" 5puts line.split('#').map{|s| eval "%\0#{s}\0"}.join('#')
  • \0を区切り文字にした%リテラルを用いる
  • #{}による式展開を無力化

することでほぼ安全にevalを実行できている(はず

投稿2018/03/09 08:46

編集2018/03/09 09:31
asm

総合スコア15147

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

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

mtdsnsk

2018/03/09 09:28

こちら意図通りに出力されました!大変助かりました。ありがとうございます! %リテラルを用いるために文字列分解して整形する手間を入れればよかったのですね。
guest

0

ファイルの中で、前後に二重引用符が付いているなら、

Ruby

1require "json" 2 3path = "テキストファイルのパス" 4File.open(path) do |f| 5 f.each_line do |line| 6 data = JSON[line] 7 puts data 8 end 9end

二重引用符が付いてない場合は、前後に付けてからJSON[~]で。

投稿2018/03/09 08:42

編集2018/03/09 08:46
otn

総合スコア84538

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

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

mtdsnsk

2018/03/09 09:30

こちらも意図通りに動作しました! 完結&迅速なご回答ありがとうございました!
otn

2018/03/09 14:59

evalを使わない簡単な方法があるのに、好き好んでevalを使わない方が良いです。
mtdsnsk

2018/03/09 23:03

おっしゃる通りです、evalよりもこちらの方法がスマートに思いました。 こちらの回答拝見する前にベストアンサーを決めてしまいました。
guest

0

テキストファイル.txt
\u97F3\u9806(\u6607\u9806)

ruby

1moji = File.open("テキストファイル.txt").read 2eval "text = \"#{moji}\"" 3puts text #=> "音順(昇順)"

投稿2018/03/09 08:40

kazto

総合スコア7196

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

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

mtdsnsk

2018/03/09 09:36

こちらも`puts eval "text = \"#{moji}\"`と修正して意図通りに動作することを確認しました。 ご回答ありがとうございました。大変助かりました。
guest

0

こう書き換えてやればいいでしょう

"&#x97F3&#x9806(&#x6607&#x9806)"

投稿2018/03/09 08:38

yambejp

総合スコア114829

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

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

mtdsnsk

2018/03/12 05:17

こちら時間がなくて試しておりませんでした!ご回答ありがとうございました。 参考にさせていただきます。
guest

0

"\u97F3\u9806(\u6607\u9806)"

テキストファイルに上記のように記述して、このファイルを読み込んでrubyのプログラムで出力した場合、そのまま"\u97F3\u9806(\u6607\u9806)"となります。

文字コードを指定しても同じです。

そらそうでしょうね。

テキストファイルにエディタなどで書き込むのなら、UTF-8を指定してファイルを作成し、そこに直接「音順(昇順)」と書き込まないとプログラムで読み出しても期待通りにはなりません。
"\u97F3\u9806(\u6607\u9806)"と書き込むということはその通りに書き込むということですから。

わかりますか?

投稿2018/03/09 08:33

PineMatsu

総合スコア3579

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

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

mtdsnsk

2018/03/09 09:38

わかります。 なので、質問の内容が、UTF-8の文字コードが直接記述されたファイルの中身を、日本語に変換して出力したいになっております!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問