読者です 読者をやめる 読者になる 読者になる

こしごぇ(B)

旧:http://d.hatena.ne.jp/koshigoeb/

「プログラマのための文字コード技術入門」で勉強中(6)

一通り目を通した。

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

「第8章 はまりやすい落とし穴とその対処」

16進ダンプツール

  • od コマンド
  • hd コマンド
  • xxd コマンド

文字化け

改行コード

  • 異なる改行コードの混在
  • nkf による改行コードの変換(-Lu, -Lw, -Lm)
  • tr コマンド
    • CR(0x0D)だけを取り除いたつもりが、UTF-16で有効な文字の一部を削ってしまう様な危険性もある

半角・全角問題

  • 文字コードは「全角・半角」を決めていない
    • 1バイト、2バイトという違いはある
  • 利用者に「全角・半角」を意識させない

全角数字を半角数字に、半角片仮名(JIS X 0201)を全角片仮名(JIS X 0208)に変換する。

$ ruby -rnkf -e "puts NKF.nkf('-Z0', '0123456789')"
0123456789
$ ruby -rnkf -e "puts NKF.nkf('-WwX', 'アイウエオ')"
アイウエオ

円記号問題

  • 円記号とバックスラッシュとが入れ替わる事がある
    • ASCIIの0x5Cはバックスラッシュだが、JIS X 0201の0x5Cは円記号
    • Shift_JISはJIS X 0201を拡張した符号化方式
    • EUC-JPはASCIIを拡張した符号化方式
    • UTF-8はASCIIの上位互換
      • HTMLのlang属性の影響で0x5Cが円記号として表示されたりする
      • フォントに依存
  • Unicodeとの変換による問題
    • ISO/IEC 8859-1(Latin-1)の円記号はU+00A5
    • U+00A5をShift_JISに変換すると0x5Cになる
    • Latin-1の¥nという文字に特別な意味は無い
      • この文字列をUnicodeに変換してからShift_JISに変換すると問題になる
      • 思わぬ経路からメタ文字が注入される危険性がある
    • 円記号とバックスラッシュは2バイトコードのものを使うことにする運用

波ダッシュ問題

  • JIS X 0208の1区33点にある記号
    • Unicodeに変換されたときに、U+301CになったりU+FF5Eになったりする
    • U+301C: WAVE DASH
    • U+FF5E: FULLWIDTH TILDE
    • 対処案
      • Unicodeに変換しない
      • コード変換を揃える
      • Unicode間で変換する
  • 1区33点以外で変換による問題が発生しがちな文字
    • 双柱(1-34)
      • U+2016: DOUBLE VERTICAL LINE
      • U+2225: PARALLEL TO
    • 負符号(1-61)
      • U+2212: MINUS SIGN
      • U+FF0D: FULLWIDTH HYPHEN-MINUS
    • セント記号(1-81)
      • U+00A2: CENT SIGN
      • U+FFE0: FULLWIDTH CENT SIGN
    • ポンド記号(1-82)
      • U+00A3: POUND SIGN
      • U+FFE1: FULLWIDTH POUND SIGN
    • 否定記号(2-44)
      • U+00AC: NOT SIGN
      • U+FFE2: FULLWIDTH NOT SIGN
    • ダッシュ(1-29)
      • U+2014: EM DASH
      • U+2015: HORIZONTAL BAR