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_JISISO-2022-JP(いわゆるJISコード)EUC-JPUnicodeではUTF-8,UTF-16が代表的
基本用語(包摂規準)「同じ文字」とみなす基準見掛けが異なる字を同じとみなすための指針JISで規定される例一点しんにょうと二点しんにょう「高」と梯子高草冠の差(つながる、途切れる、完全に切れる)
JIS X 0213:2004のインパクト文字コードの歴史、なぜJIS X 0213:2004になったか、今のままではなぜいけないのか?
WindowsとUnicodeWindows NT 3.1はUnicode 1.0を使って実装された世界最初の商用OSOSではないが、JavaもUnicode採用して1991年登場Unicode 1.0はUTF-16のみだったので、引き続きデフォルトエンコーディングはUTF-16。
現在のWindowsとUnicode1996年拡張面をサポートした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変換不可文字があればTRUElpDefaultCharと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現在動的リンクするしかありません
使うとはまるAPICharPrev/CharNextlstrlen(もちろん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でOKVistaでOpenTypeのTagを使うAPIが追加C/C++ではマクロ定義を忘れずに#define WINVER 0x0600#define _WIN32_WINNT 0x0600Uniscribe 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.3Vistaの互換フォント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/)MicrosoftJIS X 0213:2004対応と新日本語フォント「メイリオ」についてSorting It All Out(http://blogs.msdn.com/michkap/)国際化を担当されているMichel氏のblogSlashdot Japan安岡助教授の日記(http://slashdot.jp/~yasuoka/journal)WebのいろいろなところShift_JIS,Unicode,EUC(Wikipedia)およびGoogleでヒットしたサイトたち
Special Thanks本資料をレビューしていただいたりばてぃさん(http://cs.gogo-asp.net/blogs/libaty/default.aspx)
ありがとうございました

More Related Content

PDF
Windows Phoneで始める拡張現実の世界
PPTX
ColdBox i18N
PDF
開発から見たWindowsの国際化機能
PDF
Android が巨大すぎてお困りのあなたへ~組み込み Windows の今と、これから~
PPTX
Visual Studio Code あれこれ
PDF
Nishimotz pycon2011jan
PDF
Nishimotz osc2011oct-v2
PPTX
Hokuriku.net 2013 01-26 node.js
Windows Phoneで始める拡張現実の世界
ColdBox i18N
開発から見たWindowsの国際化機能
Android が巨大すぎてお困りのあなたへ~組み込み Windows の今と、これから~
Visual Studio Code あれこれ
Nishimotz pycon2011jan
Nishimotz osc2011oct-v2
Hokuriku.net 2013 01-26 node.js

Similar to JIS2004 with Windows SDK (20)

PDF
縁取りでアプリの文字を見やすくしよう
PDF
Xbox LIVEインディーズゲーム「ピアレビュー攻略」のためのXNAにおける開発のコツと特有の課題
PPT
Cerebro for VFX / Animation Japan
PPTX
オレたちとVisual Studioとの関係を話そう
PDF
Rds 2008 R2 Express Editionで遊んでみよう
PDF
Xcode以外の開発環境 AppCodeの紹介
PDF
Bar Vsug04 Masami Suzuki Windows7 UI
PPT
5分でわかるi18n
PDF
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
PDF
Developr Camp 2012 Japan Fall Day2 Special Session - Visual Studio 2012 で始める ...
PDF
Dev camp2012jpn day2special
PDF
Windows8 最新技術動向
PPTX
20120616 i os24hvol1資料
PDF
Unity開発ロードマップ最新情報
PPTX
今から始める、Windows 10&新.NETへの移行戦略
PDF
CLT-001_今だからもう一度確認したい、クライアント テクノロジの概要と選択
PPTX
ZendStudioのご紹介
PDF
Xcode 7 の新しいところ #cm_ios9
PDF
Unity 名古屋セミナー [Sprite Studio]
PPTX
C#4.0 と Visual Studio 2010/.NET Framework 4.0~ここが Cool! いけてる機能10連発!~
縁取りでアプリの文字を見やすくしよう
Xbox LIVEインディーズゲーム「ピアレビュー攻略」のためのXNAにおける開発のコツと特有の課題
Cerebro for VFX / Animation Japan
オレたちとVisual Studioとの関係を話そう
Rds 2008 R2 Express Editionで遊んでみよう
Xcode以外の開発環境 AppCodeの紹介
Bar Vsug04 Masami Suzuki Windows7 UI
5分でわかるi18n
GTMF2012 SpriteStudio と "Unity" と "CoronaSDK" と "ngCore" ! ~組み合わせて改善する 2D ワーク...
Developr Camp 2012 Japan Fall Day2 Special Session - Visual Studio 2012 で始める ...
Dev camp2012jpn day2special
Windows8 最新技術動向
20120616 i os24hvol1資料
Unity開発ロードマップ最新情報
今から始める、Windows 10&新.NETへの移行戦略
CLT-001_今だからもう一度確認したい、クライアント テクノロジの概要と選択
ZendStudioのご紹介
Xcode 7 の新しいところ #cm_ios9
Unity 名古屋セミナー [Sprite Studio]
C#4.0 と Visual Studio 2010/.NET Framework 4.0~ここが Cool! いけてる機能10連発!~
Ad

More from Kazushi Kamegawa (20)

PDF
「何もしないのにCIが失敗した」を防ぐ
PDF
Ignite 2021秋 recap - 開発者向け新機能紹介
PDF
Azure boards for beginners
PDF
Deploy Strategy with Azure Pipelines
PDF
DevOps and compliance and security
PDF
DevOps and Compliance and Security
PDF
Ignite 2021 振り返り(DevOps)
PDF
How to create your own Azure Pipeline's image
PDF
NET5 and Diagnostics
PDF
Azure DevOps入門~TechLab編
PDF
Introduce TFSUG and Azure DevOps Server 2020
PDF
Azure DevOps Online Vol.3 - Inside Azure Pipelines
PDF
Getting Start for Azure Pipelines
PDF
Azure Boards and Azure Test Plans inside out.
PDF
Azure DevOps's security
PDF
Azure DevOps Management in Organization
PPTX
What's new Azure DevOps in //Build 2019
PPTX
Deploy to Azure by ??? Azure Repos or GitHub
PDF
Azure DevOpsとセキュリティ
PPTX
What's Azure DevOps
「何もしないのにCIが失敗した」を防ぐ
Ignite 2021秋 recap - 開発者向け新機能紹介
Azure boards for beginners
Deploy Strategy with Azure Pipelines
DevOps and compliance and security
DevOps and Compliance and Security
Ignite 2021 振り返り(DevOps)
How to create your own Azure Pipeline's image
NET5 and Diagnostics
Azure DevOps入門~TechLab編
Introduce TFSUG and Azure DevOps Server 2020
Azure DevOps Online Vol.3 - Inside Azure Pipelines
Getting Start for Azure Pipelines
Azure Boards and Azure Test Plans inside out.
Azure DevOps's security
Azure DevOps Management in Organization
What's new Azure DevOps in //Build 2019
Deploy to Azure by ??? Azure Repos or GitHub
Azure DevOpsとセキュリティ
What's Azure DevOps
Ad

JIS2004 with Windows SDK