2016年5月25日(水)にNTT-ATさんの会議室にてkawasaki.rb #036を開催しました。
togetterのまとめはこちら
パーフェクトRuby読書会
「5-2-6 エンコーディングの扱い」まで終えました。
5-2-6 エンコーディングの扱い
Rubyでは1.9から文字列にエンコーディング情報を保持しています。 String#encodingでエンコーディング情報を取得できます。
1
'いろはに'.encoding # => #<Encoding:UTF-8>
文字列のエンコーディングを変更するにはString#encodeを使用します。
1
2
3
4
5
6
7
8
9
10
11
str = 'こんにちは'
str.encoding # => #<Encoding:UTF-8>
new_str = str.encode(Envoding::EUC_JP) # => "\x{A4B3}\x{A4F3}\x{A4CB}\x{A4C1}\x{A4CF}"
new_str.encoding # => #<Encoding:EUC-JP>
# 破壊的メソッド
str = 'こんにちは'
str.encoding # => #<Encoding:UTF-8>
str.encode!(Envoding::EUC_JP) # => "\x{A4B3}\x{A4F3}\x{A4CB}\x{A4C1}\x{A4CF}"
str.encoding # => #<Encoding:EUC-JP>
主にマルチバイトの場合、同じ文字列でもエンコーディングが異なると同値にはなりません。
1
2
3
4
5
6
7
8
9
utf8 = 'こんにちは'.encode('UTF-8')
eucjp = 'こんにちは'.encode('EUC-JP')
# 比較
utf8 == eucjp # => false
utf8.eql?(eucjp) # => false (eql?はハッシュのキーが同じか調べるときに使う)
# 連結
utf8 + eucjp # => Encoding::CompatibilityError: incompatible character encodings: UTF-8 and EUC-JP
ただし、ASCII互換エンコーディングな文字列とASCIIのみの文字列の比較や結合はエンコーディングに関わらず行えます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
eucjp = 'Hello'.encode('EUC-JP')
utf8 = 'Hello'.encode('UTF-8')
utf16 = 'Hello'.encode('UTF-16')
ascii = 'Hello'.encode('ASCII-8BIT')
# 比較
utf8 == eucjp # => true
utf8 == ascii # => true
utf8 == utf16 # => false
# 連結
utf8 + eucjp # => "HelloHello"
utf8 + ascii # => "HelloHello"
utf8 + utf16 # => Encoding::CompatibilityError: incompatible character encodings: UTF-8 and UTF-16
会場では、UTF-8とEUC-JPを結合した場合どちらのエンコーディングになるのかという質問があがりました。
1
2
(utf8 + eucjp).encoding # => #<Encoding:UTF-8>
(eucjp + utf8).encoding # => #<Encoding:EUC-JP>
このように、レシーバのエンコーディングが優先されるようです。 こういったエンコーディング周りの話はプログラマのための文字コード技術入門を読むとソフトウェア界の歴史が分かり良いそうです。
次回は「5-3 Regexp」からです。
今回のiruby notebookは以下のとおりです。
セッション
Let’s EncryptのDNS-01を使用して無料のSSL証明書をWebサーバなしで取得する from @xmisao
無料でSSLを使用することができるLet’s Encryptの証明書をを Webサーバを用意せずにDNSサーバで取得した話をされました。
発表元となった記事はこちら
データを一箇所に集めることでデータ活用の民主化が進んだ話 from @chezou
データを一箇所に集め整備することで、エンジニアの手を借りずWebディレクター陣だけで分析を行うことができるようになったこととその背景について語られました。
発表元となった記事はこちら
また、chezou氏が配信しているrubyistclub #9では、最近はデータ移行業を生業としているjocker1007氏との対談でRedshiftとBigQueryの比較などの話を聴くことができます。
告知
2016年8月20日に川崎Ruby会議を実施します。参加募集は近日公開いたします。お楽しみに!
http://regional.rubykaigi.org/kwsk01/
次回予告
次回は2016年6月22日(水)(毎月第4水曜日)開催予定です。ご参加お待ちしております。
寄稿者について
松久保 敬人 (@Peranikov)
node.jsやiOSアプリ開発を経て今はRailsとDDDとScalaの人。