Skip to content

Instantly share code, notes, and snippets.

@iwata
Created March 23, 2014 09:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save iwata/9720886 to your computer and use it in GitHub Desktop.
Save iwata/9720886 to your computer and use it in GitHub Desktop.
文字コード

文字コード技術超入門

文字コード技術入門

ASCII?

American Standard Code for Information Interchange

7bit 1byte code

ISO/IEC 646(JIS X 0201)

ASCIIの国際化

http://ja.wikipedia.org/wiki/ISO/IEC_646

\と¥、~と‾

  • EUC-JPはASCII拡張
  • xUnix系
  • Shift_JISはJIS X 0201拡張、JIS X 0201は、ISO/IEC 646の日本版
  • Windows系
  • utf8はASCII互換
  • \は5C, ~は7E
  • ¥はC2A5, ‾はE280BE

エスケープ文字として扱われる

utf8 ¥nをShift_JISに変換すると5C 6Eになって\nとなる

EUCでもiconvでEUC-JPに変換すると…

iconv -f UTF-8 -t EUC-JP ascii/iconv-from-utf8.txt > ascii/iconv-to-euc.txt

CotEditorではEUC-JPだと¥を保存できない

Unicode変換プログラムがバックスラッシュや円記号をどう変換するかを知っておく必要がある

波ダッシュ問題

U+301C(WAVE DASH)とU+FF5E(FULLWIDTH TILDE)

http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5

Windows OS において起きる問題

  • 字形の問題。Windows XP以前のMS 明朝、MS ゴシック、MS UI GothicにおいてUnicodeの波ダッシュ (U+301C, WAVE DASH) が不適切形「Wave Dash2.svg」で表示される。一方、Unicodeの全角チルダ (U+FF5E, FULLWIDTH TILDE) は本来の“上がって下がる” 形「Wave Dash.svg」で表示される。
  • 割り当ての問題。Shift_JISの波ダッシュ (0x8160、WAVE DASH)「Wave Dash.svg」をUnicodeの全角チルダと同一視する不適切な扱いをしている。したがって、波ダッシュ(波線)「Wave Dash.svg」を文字入力するのは容易ではなく、入力したつもりでも、不適切な全角チルダ「~」が入力されてしまう。
od -tx1z wave/utf32-be.txt

JIS X 0208:1997ではWAVE DASHが定義されており、これはU+301Cに該当する

Vista, XPでは波ダッシュ(JIS X 0213 1面1区33点)をFF5Eに変換する実装になっている

Shift_JISとCP932

http://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932

  • WAVE DASH U+301C
  • utf8→Shift_JIS可 8160
  • utf8→CP932不可
  • FULLWIDTH TILDE
  • utf8→Shift_JIS不可
  • utf8→CP932可 8160

replace_hyphen

$string =~ tr/\x{ff5e}\x{ff0d}/\x{301c}\x{2212}/;
  • ~→〜
  • -(FULLWIDTH HYPHEN MINUS)→−(MINUS SIGN)

MySQL

http://www.klab.com/jp/company/media/mysql/index6.html http://blog.everqueue.com/chiba/2009/02/05/129/

機種依存文字に対応させるには

  • cp932使うしかない
  • 海より深い理由でtableのdefault charsetはsjis
  • dbh接続時のset namesはdefault charsetと必ず揃えないと化ける
  • set names sjisEncode::encode(‘cp932’, $string)でinsert/update
  • set names sjisEncode::dencode(‘cp932’, $string)でselect
  • set charsetは使わない
  • WAVE DASHはFULLWIDTH TILDEに置換する
$string =~ tr/\x{301c}\x{2212}\x{2016}\x{2014}/\x{ff5e}\x{ff0d}\x{2225}\x{2015}/;

5C対策

my.cnfでdefault-character-set=sjis 指定してね

実はdefault-character-setにはもう1つの作用があります。それは、クライアント自身が行う文字列処理です。 例えば、mysqlコマンドを対話的に使っているときのクォート(「'」や「"」)の処理や、libmysqlclientのmysql_real_escape_string(プリペアドステートメントのプレースホルダなどで使われます)がこれにあたります。 このおかげで、エスケープを指示する「¥」(0x5C)と同じコードを含むシフトJISの「表」(0x955C)などが問題なく処理できるわけです。

http://www.shtml.jp/mojibake/sjis_cgi.html

以下5C漢字

― ソ Ы Ⅸ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔 喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 偆 砡

文字

そのチェㇷ゚は𩸽

BMP

Basic Multilingual Plane

MySQLにおける追加多言語面の扱い

uc2 and utf8mb4

http://nippondanji.blogspot.jp/2010/04/mysqlmysql-554.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment