• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
JIS2004 with Windows SDK
 

JIS2004 with Windows SDK

on

  • 2,649 views

JIS X 0213:2004をWindows ...

JIS X 0213:2004をWindows SDKレベルでどうやって対応しようかというプレゼンしたときの資料です。2007年に作ったものですが、今でもあまり変わらないはずです。

Statistics

Views

Total Views
2,649
Views on SlideShare
2,644
Embed Views
5

Actions

Likes
1
Downloads
2
Comments
0

2 Embeds 5

https://twitter.com 3
http://pec-local.swe.nec.co.jp 2

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

CC Attribution-NonCommercial LicenseCC Attribution-NonCommercial License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    JIS2004 with Windows SDK JIS2004 with Windows SDK Presentation Transcript

    • Windows SDKレベルでのJIS X 0213:2004対応
      今あるソースをどうやってマイグレーションしよう?
      Codeseek & こみゅぷらす勉強会
      2007/1/30 K.Kamegawa
    • Agenda
      文字に関する基礎知識
      JIS X 0213:2004のインパクト
      開発環境構築
      Windows SDKでどうすればいいの?
      移行シナリオ
      問題点
    • 文字に関する基礎知識
      これを知っておかないと調べてもわからない
    • 基本用語(文字コード)
      文字コード(符号化文字集合)
      文字集合に特定の符号を与えたもの。JISでは「面-区-点」という呼び方。「亜」は1面16区1点
      代表的な規格
    • 基本用語(文字集合・字体)
      文字集合
      規格で採用される文字の集まり。文字セットといわれる。ヷ(Unicodeのみ) VS ヴ(JISとUnicodeにある)
      存在しないものは外字
      字体(グリフとも呼ばれる)
      文字の形を定義する。JISでは例示字体を定めている。
      JIS X 0208では簡体字の方向。
      JIS X 0213から印刷標準字体へ変更。
      異なる文字に見えても同じ文字とみなされる場合がある。
    • 基本用語(符号化方式)
      文字をコンピュータ内部などで使用するために変換されたビット列のこと。
      代表的な符号化方式
      Shift_JIS
      ISO-2022-JP(いわゆるJISコード)
      EUC-JP
      UnicodeではUTF-8,UTF-16が代表的
    • 基本用語(包摂規準)
      「同じ文字」とみなす基準
      見掛けが異なる字を同じとみなすための指針
      JISで規定される

      一点しんにょうと二点しんにょう
      「高」と梯子高
      草冠の差(つながる、途切れる、完全に切れる)
    • JIS X 0213:2004のインパクト
      文字コードの歴史、なぜJIS X 0213:2004になったか、今のままではなぜいけないのか?
    • WindowsとUnicode
      Windows NT 3.1はUnicode 1.0を使って実装された世界最初の商用OS
      OSではないが、JavaもUnicode採用して1991年登場
      Unicode 1.0はUTF-16のみだったので、引き続きデフォルトエンコーディングはUTF-16。
    • 現在のWindowsとUnicode
      1996年拡張面をサポートしたUnicode 2.0が制定。
      Windows 2000はUnicode 2.0で実装。
      Unicode 1.0はBMP(0群0面の基本面)のみ。
      サロゲートペア
      Unicodeの未定義領域1024文字を二つ使い、一文字を表示(前:0xD800~0xDBFF,後:0xDC00~0xDFFF)
      16面まである((1024×1024)÷(256×256))=16
      結果的に可変長(32bitと基本面は16bit)。
      JIS X 0213:2004で追加された文字の一部は第二面に入っている。
    • そもそもJIS X 0213:2004って?
      JIS X 0208以来の改訂(Windows XPはJIS90+補助漢字)
      4354字が追加され、11233字
      JIS X 0208を包括したスーパーセット
      一部の文字の例示字体が新字体から康煕体へ
      朝日新聞も字体を印刷字体へ変更(2007/1/15より)
      変更のあった文字(VistaとXPで異なって見えます)
      逢 芦 飴 溢 茨 鰯 淫 迂 厩 噂 餌 襖 迦 牙 廻 恢 晦 蟹 葛 鞄 釜 翰 翫 徽 祇
      汲 灸 笈 卿 饗 僅 喰 櫛 屑 粂 祁 隙 倦 捲 牽 鍵 諺 巷 梗 膏 鵠 甑 叉 榊 薩
      鯖 錆 鮫 餐 杓 灼 酋 楯 薯 藷 哨 鞘 杖 蝕 訊 逗 摺 撰 煎 煽 穿 箭 詮 噌 遡
      揃 遜 腿 蛸 辿 樽 歎 註 瀦 捗 槌 鎚 辻 挺 鄭 擢 溺 兎 堵 屠 賭 瀞 遁 謎 灘
      楢 禰 牌 這 秤 駁 箸 叛 挽 誹 樋 稗 逼 謬 豹 廟 瀕 斧 蔽 瞥 蔑 篇 娩 鞭 庖
      蓬 鱒 迄 儲 餅 籾 爺 鑓 愈 猷 漣 煉 簾 榔 屢 冤 叟 咬 嘲 囀 徘 扁 棘 橙 狡
      甕 甦 疼 祟 竈 筵 篝 腱 艘 芒 虔 蜃 蠅 訝 靄 靱 騙 鴉
    • 開発環境構築
      作るためには何が必要か?
    • これがないとはじまらない
      Windows SDK(最新版はVista対応6000.0)
      Visual Studio 2005 Express Edition以降(MFC使う場合はStandard以上)
      MFC使う場合はUnicodeランタイムも忘れずに。
    • Visual Studio 2005セットアップ
      忘れずに追加しているかな?
    • Windows SDKではどうすればいいの?
      今までUnicodeを毛嫌いしていたんだけど…
    • まずUnicode対応
      好むと好まざるとにかかわらず、JIS X 0213:2004フルサポートするならやる。
      字体の変化の許容度合を確認する
      一般のオンラインソフトなどでは特定用途を除いて字体は無視した方が良い(コストに合わない)
      こだわりがある場合は従来字体をUnicode私用領域を使うなどの対応必要
       城市(奈良県) vs 飾区(東京都)
    • Unicodeの私用領域
      プライベートエリア。つまり外字として使える。
      BMP(U+E000~U+F8FFの6400文字)
      15面(U+Fxxxx)
      16面(U+10xxxx)
      RichEditコントロールの場合は注意
      U+F020からU+F0FFを使用している(サポート技術情報:900284)
    • ソース確認
      Unicode対応する場合、まずソースの確認。
      C言語伝統の型(char)では対応できない。
      wchar_t型の追加
      Unicode固定文字列はL”文字列”へ
      wchar_tは2byte(UTF-8を使う場合注意)
      結合文字・サロゲートペアは注意
    • 従来のメンテナンス
      C/C++では良くも悪くもプリプロセッサの恩恵がある。
      ソース自動変更、APIや対象構造体を自動的に置換。
      余談:wchar_tをサポートしていない環境ではunsigned shortに置換される。
    • Unicode対応の第一歩
      Windowsで定義されている型を使いましょう。
      charからTCHARへ
      明示的にUnicodeを格納しなければならないところはWSTR,WCHAR型
      固定文字列はTEXTマクロで例:TEXT(“この文字列は環境で変化します”)
      構造体、関数などは_UNICODEシンボルを参照して、別バージョンを定義
    • Unicode対応する第二歩
      Windows APIの自動変換をあてにする。
      実はC/C++よりもdeclareを書かなくてはならなかったVBユーザのほうがなじみが深い
      構造体は気をつけよう
      int WINAPI MessageBoxA(HWND hWnd,LPCSTRlpText, LPCSTR lpCaption,UINTuType);
      int WINAPI MessageBoxW(HWND hWnd,LPCWSTRlpText, LPCWSTR lpCaption,UINTuType);
      #ifdef UNICODE
      #define MessageBoxMessageBoxW
      #else
      #define MessageBoxMessageBoxA
      #endif // !UNICODE
    • Unicodeの特殊文字をプログラムで抑止
      IMEからの入力の場合
      WM_IME_COMPOSITIONメッセージがコントロールに送られるので、メッセージ内で判定する。
      静的解析
      エディットコントロールごとに入力が確定したタイミングでチェックする。
      でも、完璧には防げない
    • コード解析の難しさ
      文字の自動解析はかなり難しい
      どうしても符号化の間で重なるところがある
      超有名なShift_JISのと0x5c(2byte目に出てくる)
      ISO-2022-JPの場合、ESC+SHIFT-IN,SHIFT-OUTがあるので、欠落しない限りは大丈夫
    • 美乳効果で自動判定ミスを防ぐ
    • Windows APIの文字判定
      IsTextUnicode()
      バッファにUnicodeがあるかどうか判定する(複数指定可能)
      IS_TEXT_UNICODE_STATISTICS, IS_TEXT_UNICODE_REVERSE_STATISTICSフラグは100%確実ではない。
      メモ帳文字コード誤判定事件サポート技術情報:KB837192
      これら以外のフラグは積極的に使うべき
    • Shift_JISからUnicodeへ
      MultiByteToWideChar()
      MultiByte(Shift_JIS)からUnicode(UTF-16)へ。UTF-7/8も指定できる。
      COMのAPIを呼ぶときは必ずお世話になる。
      通常二回呼ぶ
      初回でバッファサイズ取得(第六引数を0)
      二回目で変換
      ATLのA2W()マクロもこれを呼んでいるだけ
    • UnicodeからShift_JISへ
      WideCharToMultiByte()
      通常、Unicodeの方が文字が圧倒的に多いので、変換の際は気をつける
      WC_NO_BEST_FIT_CHARSを指定するべき
      lpDefaultChar
      マップできない文字が出た時に置き換える文字へのポインタ
      lpUsedDefaultChar
      変換不可文字があればTRUE
      lpDefaultCharとlpUsedDefaultCharはNULLを指定すると速くなる
    • 完全な変換?
      中だけ、外だけ対応すればいいのでは?
      内部処理をUnicode(外部Shift_JIS)
      内部処理をShift_JIS(外部Unicode)
      あまりお勧めできない
    • ラウンドトリップ問題
      UnicodeとShift_JISの対応は1:1ではない。
      NEC選定IBM互換文字とIBM拡張文字
      変換テーブルの問題
      WAVEDASH,YEN-SIGN(有名なところ。ほかにもある)
      U+00A5(¥)->0x5c()->U+005c(BACKSLASH)
      通信や異環境からのデータファイルは注意
      Difference of Unicode Conversion Tables
      (http://www.autumn.org/etc/unidif.html)
      A Unicode vender-specific character table for Japanese
      (http://www.ingrid.org/java/i18n/unicode.html)
    • 結合文字
      カ(U+30AB)+゛(U+3099)でU+30ACの「ガ」と同じ意味。
      アクセント記号も同様にΑ(U+0391)+ ΄(U+0384)でΆ(U+0386)をあらわす。
      比較などを行う際は注意が必要。
      Windows Vistaのエディットコントロールは対応。
      半角カナ時代への逆行?
    • 文字の正規化
      結合文字と構成済み文字の比較時に必要
      NormalizedString()
      IsNormalizedString()
      Windows SDKの問題
      libファイルが間違っている(涙)
      normaliz.dllなのに、normalization.dllをimport
      現在動的リンクするしかありません
    • 使うとはまるAPI
      CharPrev/CharNext
      lstrlen(もちろんCRTのstrlenも)
      StringCchLength
      結合文字・サロゲートペアに対応していない(BYTE単位->WORD単位になっただけ)
      よって、文字数カウントに使うとはまる
    • グリフを混在させる
      OpenTypeのFeature Tagを使って字体の切替
      ただし、対応フォントのみ
      Win32では国際化APIのUniscribeを使う
      VistaではOpenType用のAPIが追加
      たぶん唯一のUniscribeサンプル(http://www.catch22.net/tuts/editor14.asp)
      FirefoxのWin32版もあるので、ソース見るとか…
      System.Windows.Documents.GryphsがあるWPF使う方が楽です。
    • UniscribeのOpenTypeを使う
      Feature Tagを使う場合必要
      使わない場合は従来のAPIでOK
      VistaでOpenTypeのTagを使うAPIが追加
      C/C++ではマクロ定義を忘れずに
      #define WINVER 0x0600
      #define _WIN32_WINNT 0x0600
      Uniscribe API(レンダリングの国際化)
    • OpenType Tagのレンダリング
      基本的には従来のUniscribeと変わりなし
      ScriptShapeOpenTypeでグリフを生成
      ScriptPlaceOpenTypeでグリフの位置を生成
      ScriptTextOutで表示。
      ただし、パラグラフ(レンダリング対象要素)ごとに行う
      ここではBidi(双方向性)および、
      Optionの手順を省略してます
    • で?
      UniscribeのOpenType対応難しいです。
      普通の人は考えない方がいいです。
      デモ作ろうと思ったけど間に合いませんでしたorz。
    • Unicode時代のセキュリティ
      Shift_JISではなかったようなこと
    • セキュリティ
      UnicodeにはShift_JIS時代には考えもしなかった制御コードがある。
      真面目に実装すると、GUIでユーザをだませる。
      見えない文字(ゼロ幅文字)
      双方向性機能(Bidi)
    • 特殊記号を入力する
      エクスプローラから右クリックして「Unicode制御文字の挿入」
    • でもコマンドプロンプトでは
      ゼロ幅文字が1byteの空白になるので、すぐばれる。
      まじめにチェックするしかない
    • 移行シナリオ
      今ある資産はどうしよう?
    • 突然Vistaがやってくる
      入力された文字が表示されない。
      Vistaで追加された文字はXP/2003で見えない。
      あれ、こんな文字だっけ?
      いくつかの文字の字体が変更された
      印刷字体への変更
    • フォントのインストール
      Vistaに提供されるVer 2.5フォントを使う
      MSゴシックとMS明朝のみ
      メイリオは提供されない(5.0のみ)
      JIS90グリフにはない文字もある
      でも全部にインストールするのは…
      プログラムを改造して、OpenTypeのFeature Tagを使用してJIS90字体を表示する
    • 問題点
      気をつけておかないとはまりそうです
    • MS IME2007のUnicode候補
      MS IME 2007ではJIS X 0213:2004文字も変換候補に出てくるようになった
      2007 Office SystemおよびVista内蔵のIME
    • 各フォントにおける字形の差
      Microsoftの公開情報によると、JIS X 0213:2004対応で文字の追加、字形変更が発生した。
      だがしかし
    • 二つの字の差を探してください
      XPのMSゴシック2.3
      Vistaの互換フォント2.5
      どこに違いがあるんでしょう…
      これも字形の差だそうです
    • コマンドプロンプト
      cmd.exeはコードページ932(cp932)で動作
      Unicodeにしかない文字は入力できない
      chcp 65001でUTF-8(でも日本語でない…)。
      おそらくはいまだに残るDOSコマンドの互換性のため
    • 参考資料
      はせがわさん(http://d.hatena.ne.jp/hasegawayosuke/)
      それ Unicodeで – TEXT HUCKS
      小形克弘さん
      「文字の海、ビットの舟」(http://internet.watch.impress.co.jp/www/column/ogata/)
      Microsoft
      JIS X 0213:2004対応と新日本語フォント「メイリオ」について
      Sorting It All Out(http://blogs.msdn.com/michkap/)国際化を担当されているMichel氏のblog
      Slashdot Japan
      安岡助教授の日記(http://slashdot.jp/~yasuoka/journal)
      Webのいろいろなところ
      Shift_JIS,Unicode,EUC(Wikipedia)およびGoogleでヒットしたサイトたち
    • Special Thanks
      本資料をレビューしていただいたりばてぃさん(http://cs.gogo-asp.net/blogs/libaty/default.aspx)
    • ありがとうございました