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

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

ただいまの
回答率

90.50%

  • Ruby

    7894questions

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

  • Linux

    3879questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • Ubuntu

    1474questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Rubyにて全角カタカナ→半角カタカナの変換

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 2,592

Tomjisan

score 3

初投稿です。マナー違反等ありましたらご容赦ください。

[環境]
OS: Ubuntu 12.04
言語: Ruby 18.7
NKF: NKF 2.1.1
※Ruby, NKF, Ubuntuのバージョンは諸事情によりアップグレード、ダウングレードすることはできません。

[内容]
全角カタカナ→半角カタカナの変換コードがうまくいかず困っています(3日はまっています)。
String.trではうまくいかなかったので、NKFを使うことにしました。変換箇所のコードは以下のとおりです。
------#Zkana_Hkana_convert.rb--------
temp_str = "アア123"
comp_str = NKF.nkf("-sxZ4", temp_str)
put comp_str
-------------------------------------
出力結果:アア123 

数値は半角になるのですが、肝心の全角カタカナが半角になりません。
かなりWebサイトを探し回ったのですが、解決方法が見つかりませんでした。
解決方法、または代替コードがありましたら教えていただけないでしょうか。
よろしくお願いいたします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

moji モジュールを利用してみてはいかがでしょうか

gem install moji で簡単に利用することができます

require 'moji'

p temp_str = "アア123" 
p comp_str = Moji.zen_to_han(temp_str)
# => "アア123"
# => "アア123"

詳細については、下記リンク先を参照してください

## Links
moji | RubyGems.org | your community gem host
gimite/moji - GitHub
moji

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/17 19:01

    argius様、gouf様、ご回答ありがとうございます。
    nkfにRuby内部のものと、外部のものがあるのは盲点でした。
    それに気づけただけでもかなりすっきりしましたが、結局バージョン等の変更ができないため、外部nkfをソースから呼び出すことで解決しました。
    mojiモジュールの件も今後使う機会があったら利用させて頂きたいと思います。
    ありがとうございました。

    キャンセル

checkベストアンサー

+1

Rubyに組み込まれているnkfのバージョンが古いようです。Ruby2.1.3のソース見ても-Z4の記述がない。
(NKFライブラリは、外部のnkfを呼び出すのでなく、Rubyソースに組み込まれたものを呼び出してます)

gemを自由にインストールできないとすると、地道に1文字ずつgsubで置き換えるか、あるいは下記のようにして外部のnkfを呼び出しましょう。
def external_nkf(str, opt="-sxZ4")
  require "open3"
  Open3.popen3("/usr/local/bin/nkf #{opt}") do |i,o,e|
    i.write(str)
    i.close
    o.read
  end
end

プロセスを起動するので、ループの中で繰り返し呼ぶなら、1文字ずつ置き換える方が良いかも。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/17 18:58

    otn様。ご回答ありがとうございます。
    なかなか時間が取れず返信が送れてしまい申し訳ありません。
    結局、複数台のサーバーに絡むプログラムでしたのでバージョン等の変更が出来ず、教えていただいた方法(Ruby内部ではなく外部のnkfライブラリを呼ぶ)で解決いたしました。

    temp_str = ori_str.toeuc
    Open3.popen3("echo "+temp_str+" | nkf -Z1 -sxZ4"){|i,o,e|
    comp_str = o.read}
    comp_str = comp_str .gsub(/[\r\n]/,"") #改行データの削除

    本当に助かりました。ありがとうございました。

    キャンセル

+1

(追記)
明記していませんでしたが、Rubyのnkfモジュールのバージョンと、単独のnkfのバージョンを混同されているのかもしれません。

OSは異なりますが、Ruby 1.8.7 (NKF 2.0.8) MacOSX 10.6に、nkf2.1.3をインストールして試しました、これならできました。
require 'nkf'は不要です。
temp_str = "アア123"
comp_str = `echo #{temp_str} | nkf -Z4`
puts comp_str



(最初の回答)
解決方法ではありませんが、異なるバージョンで試した結果をご報告します。

  • Ruby 1.8.7, NKF 2.0.8 MacOSX 10.6          => 失敗
  • Ruby 1.9.3, NKF 2.1.2 Windows 7(Cygwin) => 成功
  • Ruby 2.1.3, NKF 2.1.3 Windows 7(Cygwin) => 成功

otnさんの情報では、2.0.8では全角カタカナを半角カタカナに対応していないようですので当然の結果ですけれど。
※NKFはNKF::VERSIONで確認しています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/10 12:08

    ソースのコメントしか見てませんでした。
    ソースのコメントに書いてないだけで1.9以降だと-Z4に対応してるんですね!

    キャンセル

  • 2014/10/10 17:37

    私も今ソースコードを見てみました(ruby-1.9.3-p547)。
    確かに、nkf/nkf.cのほうのドキュメントコメントには、`Z[0-3]`と書かれています。
    オプション解析処理自体をやっていると思われるnkf/nkf-utf8/nkf.cのL.6310で、0~4を受けつけていますね。

    キャンセル

  • 2014/10/14 00:04

    以前調べたことがあったのですが、nkf 2.0.9(Ruby 1.9.1)以降で-Z4オプション対応しています。
    [ニュース: nkf 2.0.9 リリース - nkf Network Kanji Filter - SourceForge.JP](http://sourceforge.jp/projects/nkf/news/17482)

    キャンセル

  • 2014/10/14 00:09

    本家のリリース情報ですね。
    ご提供ありがとうございます。

    キャンセル

0

参考情報を投稿します。

NKF 2.0.8 から 全角カタカナを半角カタカナに変換 が可能になったとの情報がありますね。

- Rubyで全角カタカナを半角カタカナに変換する http://qiita.com/Qureana/items/babe3b5d952f86138c99
- 文字コード変換プログラム「nkf 2.0.9」リリース http://codezine.jp/article/detail/3519
...
日本語の文字コード変換プログラム「nkf(network kanji filter)」が1年半ぶりにバージョンアップされ、2.0.9が1月20日にリリースされた。このバージョンは、Ruby 1.9.1に同梱される。
2.0.8からの主な修正点として、以下のオプションが追加された。
全角カタカナを半角カタカナに変換するオプション(-Z4)
...

- nkfを使ってひらがな、カタカナ(全角・半角)間の変換行う ceron.jp/normal/ には 変換するコード例も載っています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/10 10:52

    2.0.8から2.0.9の変更点なので「2.0.9から 全角カタカナを半角カタカナに変換 が可能」ですね。

    キャンセル

  • 2014/10/17 19:03

    katoy様、ご回答ありがとうございます。
    v2.0.9からZ4オプションが使えるということでしたが、Ruby内部と外部のNKFでバージョンが違っていたのは盲点でした。
    勉強になりました、ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7894questions

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

  • Linux

    3879questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • Ubuntu

    1474questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

関連ワード: ruby 全角 半角 変換