A6 Delphiテクニカルセッション Delphi 2009ではじめるUnicodeアプリケーション - 既 存 コード 移 行 のポイント - 有 限 会 社 エイブル 富 永 英 明 アジェンダ Unicode の 基 礎 知 識 旧 プロダクトからの 移 行 Delphi 2007 へ Delphi 2009 と Unicode 旧 プロダクトからの 移 行 Unicode アプリケーション 資 料 2
Unicode の 基 礎 知 識 Unicode の 基 礎 知 識 文 字 セット UCS-4 (Fixed DWORD) Unicode (Range of 21bits) UCS-2 (Fixed WORD) ANSI JIS X 208 4
Unicode の 基 礎 知 識 文 字 エンコーディング JIS X 208 EUC-JP SHIFT-JIS (MS CP932) JIS CODE Unicode/UCS UTF-8 UTF-16 UTF-32 5 Unicode の 基 礎 知 識 UTF-32 UCS-4 (Fixed DWORD) Unicode (Range of 21bits) UTF-32 (Fixed DWORD) UCS-2 (Fixed WORD) 6
Unicode の 基 礎 知 識 UTF-16 UTF-16 (WORD / Double WORD) Single WORD UCS-4 (Fixed DWORD) BMP (UCS-2) Surrogate #1 0xD800-0xDBFF (1st Word) Surrogate #2 0xDC00-0xDFFF (2nd Word) Unicode (Range of 21bits) Double WORD UCS-2 (Fixed WORD) All Unicode without BMP ( Surrogate Pair = DWCS) 7 Unicode の 基 礎 知 識 UTF-8 Single byte UTF-8 (Multi byte) 1byte Characters / ANSI (Part of BMP) Extension Area UCS-4 (Fixed DWORD) Unicode (Range of 21bits) UCS-2 (Fixed WORD) Double byte 2bytes Characters (Part of BMP) Triple byte 3bytes Characters (Part of BMP) Quadruple byte 4bytes Characters (All Unicode without BMP) Extension Area Extension Area Extension Area 8
Unicode の 基 礎 知 識 プレーン Unicode Plane #0 (BMP=UCS-2) U+0000-U+FFFF Plane #1 (SMP) U+10000-U+1FFFF Plane #5 (reserved) U+50000-U+5FFFF Plane #9 (reserved) U+90000-U+9FFFF Plane #2 (SIP) U+20000-U+2FFFF Plane #6 (reserved) U+60000-U+6FFFF Plane #10 (reserved) U+A0000-U+AFFFF Plane #3 (reserved) U+30000-U+3FFFF Plane #7 (reserved) U+70000-U+7FFFF Plane #11 (reserved) U+B0000-U+BFFFF Plane #4 (reserved) U+40000-U+4FFFF Plane #8 (reserved) U+80000-U+8FFFF Plane #12 (reserved) U+C0000-U+CFFFF Plane #13 (reserved) U+D0000-U+DFFFF Plane #14 (SSP) U+E0000-U+EFFFF Plane #15 (PUP #A) U+F0000-U+FFFFF Plane #16 (PUP #B) U+100000- U+10FFFF 9 Unicode の 基 礎 知 識 サロゲートペア UTF-16 で U+10000 以 降 のコードポイントの 文 字 は 2ワード で 表 す SHIFT-JIS のように 第 2 文 字 構 成 要 素 が 1 ワード 文 字 の 範 囲 と 重 複 する 事 はないため 文 字 検 索 やデリミタの 判 別 は 容 易 となる 第 1 文 字 構 成 要 素 と 第 2 文 字 構 成 要 素 の 範 囲 も 重 複 しない UTF-8 / UTF-32 にサロゲートペアの 概 念 はないが Windows の Unicode は UTF-16 なので サロゲートペアを 考 慮 せずに 変 換 した 場 合 に 影 響 が 出 る 例 えば UTF-8 の 4バイト 文 字 は U+10000 以 降 のコード ポイントの 文 字 を 表 すので 4バイト 文 字 が 不 正 になってしまう サロゲートペアを 考 慮 しないと Unicode 1.0 (UCS2) アプリケーションし か 作 れない サロゲートペアで 表 される 文 字 は コードポイントからすれば Unicode 全 体 の 16/17 となる 詳 細 は http://dn.codegear.com/jp/article/38811 で 10
Unicode の 基 礎 知 識 結 合 文 字 列 見 た 目 の1 文 字 を 複 数 のコードポイントで 表 すのが 結 合 文 字 列 結 合 文 字 列 は 基 底 文 字 + 結 合 文 字 の 並 び 例 えば 基 底 文 字 か と 結 合 文 字 の 組 み 合 わせで が という 結 合 文 字 列 となる これとは 別 に が という 単 独 のコードポイントの 文 字 も 存 在 する これ は 合 成 文 字 とよばれる 結 合 文 字 列 から 合 成 文 字 へ 変 換 する 事 を 合 成 逆 に 合 成 文 字 から 結 合 文 字 列 へ 変 換 する 事 を 分 解 という 10を 超 えるコードポイントで 構 成 される 結 合 文 字 列 が 存 在 する 結 合 文 字 列 の が と 合 成 文 字 の が は 見 た 目 では 判 断 できない 文 字 列 検 索 の 際 には 結 合 文 字 列 と 合 成 文 字 を 同 一 視 しなくてはなら ない 場 合 があり 前 処 理 として 正 規 化 (Normalize) を 行 う 必 要 がある 詳 細 は http://dn.codegear.com/jp/article/38816 で 11 Unicode の 基 礎 知 識 その 他 の 注 意 点 エンコードによってはファイルの 先 頭 に BOM(バイト オーダー マーク) と 呼 ばれるバイトオーダを 調 べるためのマーカが 付 加 される 事 がある U+FEFF ( ZERO WIDTH NO-BREAK SPACE ) のように 幅 0 の 文 字 が 存 在 する Unicode では 文 字 の 半 角 / 全 角 サイズを 文 字 構 成 要 素 数 では 判 断 できな い 12
Unicode の 基 礎 知 識 Windows と Unicode Win9x の Unicode は UCS2 NT 系 の Windows の Unicode は UTF-16 Vista では 何 も 考 えずに サロゲートペアを 扱 えるが 2000 / XP では 多 少 の 環 境 設 定 が 必 要 となる JIS X 0213:2004 の 範 囲 の Unicode しか 扱 わないのであれば フォン トに メイリオ または IPAフォント(http://ossipedia.ipa.go.jp/ipafont/) が 使 える 単 一 のフォントで 収 録 された 文 字 が 多 いのは MingLiU または SimSun Office 2000 以 降 を 持 っているのであれば Arial Unicode MS が 使 え る これは Unicode 2.1 規 格 のすべての 文 字 を 網 羅 する Vista と JIS X 0213:2004 についての 資 料 は JIS X 0213:2004 / Unicode 実 装 ガイド (Microsoft) http://go.microsoft.com/fwlink/?linkid=78800 がある 13 旧 プロダクトからの 移 行 Delphi 2007 へ -
旧 プロダクトからの 移 行 Delphi 2007 へ Delphi 1 Delphi 7 または Delphi 2007 へ 32bit 化 Delphi 2 ~ Delphi 5 Delphi 7 へ コンポーネントの 修 正 (dsgnintf DesignIntf) ネットワークコンポーネントの 置 換 (NetManage) Delphi 6 ~ Delphi 7 Delphi 2007 へ CLXコードの 排 除 Delphi 2005 ~ Delphi 2006 (Turbo Delphi 含 む) Delphi 2007 へ XP / Vista 対 応 (XPMan / VistaAltFix / FastMM の 削 除 ) 15 旧 プロダクトからの 移 行 Delphi 2007 へ DsgnIntf (~ Delphi5) Dsgnintf を uses しているコンポーネントは DesignIntf / DesignEditors を uses するように 変 更 しなくてはならない // [ 旧 ] uses..., DsgnIntf,... // [ 新 ] uses..., DesignIntf, DesignEditors, VCLEditors, RTLConsts,... FastMM (Option) BDS2006 で 採 用 された 新 しいメモリマネージャと 同 等 のメモリマネージャ http://sourceforge.net/project/showfiles.php?group_id=130631 からDL 可 能 詳 細 は 以 下 のURLで http://dn.codegear.com/jp/article/33624 http://dn.codegear.com/jp/article/33696 16
旧 プロダクトからの 移 行 Delphi 2007 へ Vista Alt Fix (~ BDS 2006) Delphi 2007 以 前 のプロダクトでは テーマに 対 応 させたアプリケーションをVistaで 動 作 させた 場 合 単 にAltキーを 押 下 するだけで コントロールの 一 部 が 正 しく 描 画 さ れなくなってしまう これを 回 避 するのが VistaAltFix (http://cc.codegear.com/item/24282) Delphi 2007 / Delphi 2009 には 不 要 17 旧 プロダクトからの 移 行 Delphi 2007 へ Delphi 2007 でやるべき 事 コンポーネント (パッケージ) / ライブラリの 整 備 XP / Vista 対 応 BDE の 代 替 レポートツールの 精 査 (できれば)Delphi 2009 互 換 機 能 の 実 装 ステップアップグレードのススメ 16bit Windows 専 用 Delphi (1) Win9x 対 応 最 終 版 Delphi 7 Ansi 対 応 最 終 版 Delphi 2007 Unicode 対 応 版 Delphi 2009 必 要 に 応 じて Delphi 2009 からのバックポート 18
旧 プロダクトからの 移 行 Delphi 2007 へ 19 Delphi 2009 と Unicode
Delphi 2009 と Unicode IDE (1) コードエディタ から オブジェクトインスペクタ に 至 るまで 完 全 に Unicode 化 されている サロゲートペアも 正 しく 表 示 できる 21 Delphi 2009 と Unicode IDE (2) Windows 2000 / XP ではシステムフォント Tahoma の 影 響 で サロ ゲートペアを 正 しく 表 示 できない 22
Delphi 2009 と Unicode IDE (3) Unicode 化 により IDE がシステムのコードページに 影 響 されなくなった 上 : Delphi 2007 下 : Delphi 2009 23 Delphi 2009 と Unicode RTL RTL は Unicode を 扱 うための 関 数 /クラスが 強 化 されている ファイル 入 出 力 には TEncoding クラス を 利 用 可 能 ( 後 述 ) RTL は 基 本 的 に W 系 API を 呼 び 出 す 24
Delphi 2009 と Unicode VCL VCL も Unicode をサポートするが IDE 同 様 一 部 の VCL でシステム フォントの 影 響 を 受 けてしまい 2000 / XP では 正 しくフォントを 設 定 してい ても サロゲートペアを 正 しく 表 示 できない 事 がある RibbonGroup のキャプションが で 表 示 されている( 設 計 時 /QCあり) Button の Hint が で 表 示 されている Hint や Form の Caption は [デスクトップ プロパティ デザイン 詳 細 設 定 ] にてフォントを 変 更 する 事 により 対 処 可 能 25 旧 プロダクトからの 移 行 Unicode アプリケーション
旧 プロダクトからの 移 行 Unicode アプリケーション ANSIアプリケーション と Unicodeアプリケーション 従 来 のDelphiアプリケーション Unicode アプリケーション インポート (ANSI) インポート (Unicode) インポート (Unicode) インポート (ANSI) コアアプリケーション ( 内 部 実 装 ANSI) コアロジック (Unicode) コアアプリケーション ( 内 部 実 装 Unicode) コアロジック (ANSI) エクスポート (ANSI) エクスポート (Unicode) エクスポート (Unicode) エクスポート (ANSI) 27 旧 プロダクトからの 移 行 Unicode アプリケーション アプリケーションを Unicode 化 することのメリット 多 言 語 を 同 時 に 表 示 可 能 日 本 でよく 使 われる 文 字 に 限 定 しても 利 用 可 能 な 文 字 が 増 える m3 髙 etc 入 出 力 ファイルに 多 くのANSIコードページが 利 用 可 能 アプリケーションのローカライズが 比 較 的 簡 単 に 煩 雑 なマルチバイト 処 理 から 解 放 される 28
旧 プロダクトからの 移 行 Unicode アプリケーション プロジェクトファイルの 移 行 ( 自 動 ) プロジェクトファイル (*.dpr) プロジェクトオプションファイル (*. bdsproj / *.dproj) Delphi 2009 プロジェクトファイル (*.dpr) プロジェクトオプションファイル (*.dproj) プロジェクトオプションファイル バックアップ (*.dproj.2007) 29 旧 プロダクトからの 移 行 Unicode アプリケーション プロジェクトファイルの 移 行 ( 手 動 ) プロジェクトファイル (*.dpr) プロジェクトオプションファイル (*. bdsproj / *.dproj) リソースファイル (*.res) バックアップ Delphi 2009 プロジェクトファイル ( 新 規 作 成 ) ソースファイル (*.pas / *.dfm 他 ) プロジェクトファイル (*.dpr) プロジェクトオプションファイル (*.dproj) 30
旧 プロダクトからの 移 行 Unicode アプリケーション 新 しいプロジェクトで 不 要 なユニット / コンポーネントの 除 去 XPMan プロジェクトオプションで 指 定 FastMM 標 準 のメモリマネージャと 同 等 VistaAltFix Delphi 2007 からは 不 要 新 しいプロジェクトファイルに 指 定 できるもの ReportMemoryLeaksOnShutdown (BDS 2006 ~) アプリケーション 終 了 時 にメモリリークをレポート Application.MainFormOnTaskbar (Delphi 2007 ~) メインフォームをタスクバーへ 格 納 Application. DefaultFont (Delphi 2009) ParentFont := True の フォーム 用 デフォルトフォントの 指 定 Screen. MessageFont (Delphi 2009) メッセージボックス 用 デフォルトフォントの 指 定 31 旧 プロダクトからの 移 行 Unicode アプリケーション 文 字 欠 損 の 検 索 暗 黙 的 文 字 列 キャスト(W1057) 暗 黙 的 文 字 列 キャストによるデータ 喪 失 の 可 能 性 (W1058) set 式 で WideChar がバイト 文 字 に 変 換 されました(W1050) をワーニングからエラーに 昇 格 させる {$WARN IMPLICIT_STRING_CAST ERROR} {$WARN IMPLICIT_STRING_CAST_LOSS ERROR} {$WARN WIDECHAR_REDUCED ERROR} Set 式 をCharInSet() で 置 き 換 える if (S[i] in ['A'..'Z']) then if CharInSet(S[i], ['A'..'Z']) then 32
旧 プロダクトからの 移 行 Unicode アプリケーション ANSI 文 字 列 の 部 分 使 用 ANSI 文 字 列 で 内 部 実 装 してはいけない 局 所 的 な 使 用 に 留 めるべき String は AnsiString に 置 換 文 字 列 操 作 関 数 の 引 数 と 戻 り 値 関 数 内 の String は RawByteString に PChar は PAnsiChar に 置 換 AnsiStrings 名 前 空 間 を uses した 際 の 副 作 用 の 把 握 旧 プロダクトの Delphiプロジェクト (ANSI) Delphi 2009 プロジェクト (Unicode) ANSI 処 理 Delphi 2009 プロジェクト (ANSI) 33 旧 プロダクトからの 移 行 Unicode アプリケーション メモリリーク 検 出 とデバッグ 移 行 するプロジェクトには ReportMemoryLeaksOnShutdown := True; を 指 定 し メモリリーク 箇 所 を 調 べる 経 験 上 PChar 等 のメモリ 確 保 / 解 放 部 分 にバグが 潜 んでいる 事 が 多 い コントロール 文 字 列 の4 桁 化 2 桁 のコントロール 文 字 列 は 意 図 しない ANSI->Unicode 変 換 を 避 ける ためにすべて4 桁 化 する (#$0D#$0A #$000D#$000A) 入 出 力 するファイルのチェック SHIFT-JIS で なくてはならないのか?Unicode でいいのか? Iniファイルは それを 利 用 する Unicode アプリケーションに 合 わせて Unicode(UTF-16) で 入 出 力 するようにすべき 34
旧 プロダクトからの 移 行 Unicode アプリケーション TEncoding (1) TEncoding を 利 用 して Unicode 形 式 ファイルを 入 出 力 可 能 procedure TForm1.Button1Click(Sender: TObject); var SL: TStringList; begin SL := TStringList.Create; try SL.Add('あいうえお'); // ファイル 保 存 SL.SaveToFile('C: Unicode.txt', TEncoding.Unicode); // UTF-16LE // UTF-16BE SL.SaveToFile('C: UTF-16BE.txt', TEncoding.BigEndianUnicode); SL.SaveToFile('C: UTF-8.txt', TEncoding.UTF8); // UTF-8 SL.SaveToFile('C: UTF-7.txt', TEncoding.UTF7); // UTF-7 finally SL.Free; end; end; 35 旧 プロダクトからの 移 行 Unicode アプリケーション TEncoding (2) TEncodingクラスを 利 用 できるメソッドは 以 下 の 通 り ComCtrls.TOutlineNode.WriteNode ComCtrls.TOutlineNode.LoadFromFile ComCtrls.TOutlineNode.LoadFromStream ComCtrls.TOutlineNode.SaveToFile ComCtrls.TOutlineNode.SaveToStream ComCtrls.TOutlineNode.WriteNode Classes.TStrings.LoadFromFile Classes.TStrings.LoadFromStream Classes.TStrings.SaveToFile Classes.TStrings.SaveToStream Classes.TStringStream.Create Classes.TStreamReader.Create Classes.TStreamWriter.Create 36
旧 プロダクトからの 移 行 Unicode アプリケーション TEncoding (3) TEncoding.GetEncoding() を 利 用 する 際 にはインスタンスの 破 棄 が 必 要 CP_UTF8 を 指 定 する 事 によって BOM なし UTF-8ファイルを 扱 える procedure TForm1.Button1Click(Sender: TObject); var SL: TStringList; Enc: TEncoding; begin SL := TStringList.Create; Enc := TEncoding.GetEncoding(CP_UTF8); // UTF-8(CP_UTF8/CP65001) try SL.Add('あいうえお'); SL.SaveToFile('C: UTF-8N.txt', Enc); finally Enc.Free; SL.Free; end; end; 37 旧 プロダクトからの 移 行 Unicode アプリケーション 移 行 後 のブラッシュアップ 今 時 の Unicode アプリケーションを 作 るのなら それなりのブラッシュアッ プが 必 要 フォント 変 更 UIの 追 加 すべての Unicode 文 字 を 網 羅 したフォントは 存 在 しない アプリケーションで 指 定 したフォントを 相 手 が 持 っているとは 限 らない サロゲートペアへの 対 応 サロゲートペアは 特 殊 文 字 ではない 詳 細 は http://dn.codegear.com/jp/article/38811 で 結 合 文 字 列 への 対 応 文 字 列 検 索 や データベースへのデータ 格 納 の 処 理 を 行 う 際 には 前 処 理 として 正 規 化 (Normalize)を 行 う 必 要 がある 詳 細 は http://dn.codegear.com/jp/article/38816 で 38
資 料 資 料 Unicode 関 連 Delphi Unicodeワールド パートI http://dn.codegear.com/jp/article/38781 Delphi Unicodeワールド パートII http://dn.codegear.com/jp/article/38698 Delphi Unicodeワールド パートIII http://dn.codegear.com/jp/article/38699 Delphi 2009 と Unicode : Part I http://dn.codegear.com/jp/article/38781 Delphi 2009 と Unicode : Part II http://dn.codegear.com/jp/article/38783 Delphi 2009 と Unicode : Part III http://dn.codegear.com/jp/article/38786 Delphi 2009 と Unicode : 番 外 編 (サロゲートペア) http://dn.codegear.com/jp/article/38811 Delphi 2009 と Unicode : 番 外 編 ( 結 合 文 字 列 ) http://dn.codegear.com/jp/article/38816 The Unicode Consortium http://unicode.org/ 40
資 料 Delphi 2009 関 連 CodeGear Delphi 2009 および C++Builder 2009 のインストール ノート http://dn.codegear.com/jp/article/38484 CodeGear Delphi 2009 および C++Builder 2009 のリリース ノート http://dn.codegear.com/jp/article/38489 Delphi/C++Builder/RAD Studio2009 のアンインストール http://support.codegear.com/jp/article/38836 Delphi 2009 機 能 評 価 ガイド http://dn.codegear.com/jp/article/38817 Delphi 2009 と 文 字 列 型 http://dn.codegear.com/jp/article/38791 Delphi 2009 のIDE 設 定 http://homepage1.nifty.com/ht_deko/tech020.html リファレンスマニュアル http://docs.codegear.com/ Quality Central (Delphi 2009 関 連 ) http://qc.codegear.com/wc/qcmain.aspx?search=1&proj=10&vers=12.0 QualityCentral の Tips http://dn.codegear.com/jp/article/38793 41 資 料 その 他 Delphi の 製 品 情 報 http://www.geocities.jp/ht_deko/delphi/index.html InstallAware を 使 って 配 布 モジュールを 作 成 する http://dn.codegear.com/jp/article/34383 InstallAware に 関 する Tips http://homepage1.nifty.com/ht_deko/tech023.html 今 更 ながら BDE (Borland Database Engine) http://homepage1.nifty.com/ht_deko/tech024.html MECSUtils http://cc.codegear.com/item/26061 MECSUtils リファレンス http://homepage1.nifty.com/ht_deko/tech021.html Vista Alt Fix http://dn.codegear.com/jp/article/38791 FastMM4 http://sourceforge.net/project/showfiles.php?group_id=130631 QuickReport Standard http://www.quickreport.co.uk/stanlegacy.html 42
資 料 MEMO 43