トップ «前の日記(2008-03-01) 最新 次の日記(2008-03-03)» 編集

日々の破片

著作一覧

2008-03-02

_ UTF-32からUTF-16とUTF-8を作る

ちょっと調べる必要があったので、作った。(追記:タイトルは嘘ですね。2バイトを越えた——素のUTF-16で表現できない文字の変換)
#!/usr/local/bin/ruby
 
if ARGV.length != 1
  STDERR.puts 'usage: ruby u.rb 0xコード'
  exit 1
end
ch = ARGV[0].to_i(16)
 
u = ch - 0x10000
u0 = u >> 10 | 0xd800
u1 = u & 0x3ff | 0xdc00
printf "surrogate pair = \\u%04x \\u%04x\n", u0, u1
 
u = [18, 12, 6, 0].inject([]) do |r, x|
  r << (ch >> x & 0x3f | 0x80)
end
u[0] |= 0x70
printf "utf-8 = 0x%02x 0x%02x 0x%02x 0x%02x\n", u[0], u[1], u[2], u[3]
実行してみる。
$ ruby u.rb 0x2a422
surrogate pair = \ud869 \udc22
utf-8 = 0xf0 0xaa 0x90 0xa2
ちなみに上の字は、多分だけど、ガッツと読む。
ベルセルク (32) (ヤングアニマルコミックス)(三浦建太郎)

参考にしたページ:J2SE 5.0の新機能(第21回 文字操作の変革)
WikipediaのUnicode一覧
あとは、昔ながらの方法:echo 貼り付けた文字>a; od -t x1 a


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

ジェズイットを見習え