忍者ブログ

(´゚д゚`)ンマッ!!

Ruby,JavaScriptについての備忘録として書きます。自分用です。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Rubyで出力(print,puts)する時の文字コードを設定する

Windowsでプログラムしていると、
コマンドプロンプトの設定はsjisのままがいいけど、Rubyファイルはutf8で扱いたい。なんてことがよくあると思います。(俺だけ?)

で、その何が問題かと言うと、
「Rubyファイルの文字コードをutf8で保存すると、printやputsで出力したときに日本語が文字化けする」ってことです。
じゃあRubyファイルをsjisにするか、コマンドプロンプトをutf8にしろよっていう声が聞こえてきそうですが、
Rubyファイルはutf8じゃないといろいろと問題があって、コマンドプロンプトは他のsjisのプログラムが実行しにくくなるので嫌です。

ということで、出力するときの文字コードを指定できるメソッドを書いてみました。

#!/usr/bin/ruby
$CCODE = 's'
require 'nkf'

def cputs(s,icode="")
	if icode!=""
		case icode[0,1].upcase
			when 'W' then i=icode
			when 'U' then i='W'
			when 'I' then i='J'
			else i=icode[0,1]
		end
	else i='' end
	if $CCODE!=""
		case $CCODE[0,1].downcase
			when 'w' then o=$CCODE
			when 'u' then o='w'
			when 'i' then o='j'
			else o=$CCODE[0,1]
		end
	else puts s;return false end
	puts NKF.nkf("-#{o}#{i}xm0", s)
	return true
end

def cprint(s,icode="")
	if icode!=""
		case icode[0,1].upcase
			when 'W' then i=icode
			when 'U' then i='W'
			when 'I' then i='J'
			else i=icode[0,1]
		end
	else i='' end
	if $CCODE!=""
		case $CCODE[0,1].downcase
			when 'w' then o=$CCODE
			when 'u' then o='w'
			when 'i' then o='j'
			else o=$CCODE[0,1]
		end
	else print(s);return false end
	print(NKF.nkf("-#{o}#{i}xm0", s))
	return true
end
cputsがputsの文字コード指定版で、cprintがprintの文字コード指定版です。
どっちもやってることは同じです。というか、一行しか変わりません。

これを定義した後に、
cputs "こんにちわ"
cprint "ハロー, 世界。"
とすれば文字コードを変換して出力します。

出力する文字コードはグローバル変数、$CCODEで指定します。
$KCODEと同じく、最初の1文字目しか見てませんので、utf8と書いてもuと書いても結構です。
ただし、最初の1文字目が'w'の場合はNKH変換に$CCODEの内容をそのまま使いますので、
NKFのオプションが分かる方は'w16L0'等と指定することも出来ます。
NKFの主なオプションはこちらをご覧下さい
るびま - NKHの主なオプション

また、cputsとcprintのそれぞれの第2引数は、
cputsまたはcprintに渡される文字列の文字コードを指定できます。
文字コードが明確な場合は、指定する方が変換ミスがなくなるはずです。
もちろん、指定しなくても構いません。指定しなければ自動判別になります。

それと、kconvのString#tosjisなどの変換メソッドでは
半角カタカナが全角カタカナになったり、MIMEエンコードされている文字列を勝手にデコードしたりしますが、このメソッドではそのようなことはしません。
逆に言えば、そのようなことがしたいのであれば、NKH変換の部分を書き換えてください。
m0とxを削除すればおkだと思います。

どちらのメソッドの戻り値も、
変換に成功した場合はtrue、
変換に失敗($CCODEが指定されていない)した場合はfalse、です。

$CCODEが指定されていない場合は、普通にそのままprint、putsします。

拍手[0回]

PR

Comment

お名前
タイトル
E-MAIL
URL
コメント
パスワード

Trackback

この記事にトラックバックする

Copyright © (´゚д゚`)ンマッ!! : All rights reserved

TemplateDesign by KARMA7

忍者ブログ [PR]

管理人限定

プロフィール

HN:
starlit
性別:
男性
自己紹介:
Ruby,JavaScriptでWebサービスとか作ったりしています。
こんなん作れば?とかもっとこうすれば?とかもあれば言ってください。

一緒になんか作ろうぜ!とか言う人は
是非メールなりなんなり送って下さい!

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

ブログ内検索

最新CM

カウンター