ブログランキング・にほんブログ村へ
PVアクセスランキング にほんブログ村
子豚のココのお勧め商品 - にほんブログ村

■おすすめの商品
防災グッズ
Evopow ポータブル電源 ソーラーパネル セット リン酸鉄リチウム 1024Wh 出力1000W (瞬間最大2000W)とソーラーパネル 100W ポータブルバッテリー 22% 純正弦波 車中泊 防災 キャンプ 家庭用 アウトドア用
最新記事
写真ギャラリー
検索
カテゴリアーカイブ
タグクラウド
最新コメント
リンク集
RSS取得

広告

posted by fanblog

2015年11月12日

猿でもできる!システム開発者が陥るCP932、Unicode、シフトJIS問題。


シフトJIS


Shift_JIS(シフトジス)は、コンピューター上で日本語を含む文字列を表現するために用いられる文字コードの一つ(Wikipedia引用)


「Microsoft コードページ 932(以下 CP932)は、マイクロソフト及び、MS-DOSのOEMベンダがShift_JISを独自に拡張した文字コードである。 ... 」
とあるように、Windowsが扱う文字コードは、シフトJISではなく。MS932です。または、コードページ CP932ともいわれています。


今回行った事


問題のシステムは自社開発したもの。
表示、入力、印刷、ファイル出力共にシフトJIS(CP932)を利用していた。

リリース当時はWindowsXPの全盛期。
利用者は全国の一般ユーザーで、Windows98やMe、2000などを利用している人もいた。
中には、Windows Server を利用する人もいるので、
結局は殆どのOSで動作する必要があった。

さらに、時の流れに合わせて、Windows7、8、8.1、10とOSが新しくなる度に、
システムもアップグレードしていったのだが、
文字コードはそのままだった。

従って、一部の文字が「?」になるなどし、
次第にクレームになっていった。

ということで、今年の10月からUnicode対応させるべくプログラム修正を開始したのが事の始まり。


Unicode対応


開発言語はDelphi2007を利用していたので、DelphiXE2にアップグレード。
というか、念のためにVirtualBOXでバーチャル環境構築し、
そこにDelphiXE2をフルインストール。

ちなみに、Delphi2009からは文字列がUnicodeになったので、
通常であれば、Delphi2007以前のコードを移植するには、
変数宣言の PChar を PAnsiChar へ、String を AnsiString へ、
型キャスト PChar を PAnsiChar へ、String を AnsiString へ置換すればよいのですが、


今回はUnicodeで処理するようにするので、
PChar をPWideCharに、String を WideString に置換。

型キャストも同様にする必要があります。


また、データベースにはSQL Server を利用してたので、
char、varchar、text型のフィールドを
nchar、nvarchar、ntext、または nvarchar(max)型に変更しました。

また、TStringListでファイル入出力していた箇所は、
読み書き時の、TStringList.LoadFromFile / SaveToFile で、
第二引数として、TEncoding.Unicodeを指定するようにしました。


また、FormやReportの保存文字コードをShift_JISにしていたので、
Formをフォームとして表示させ、
SHIFTJIS_CHARSET を DEFUALT_CHARSETに置換しました。


TADOQueryなどのデータベースコンポーネントを利用していたので、
これのフィールド項目の型もStringからWideStringなどに変更しました。


varcharやtext型はバイト数だったのに対して、
nvarcharやntext型は文字数だという点です。

ですから、画面上の入力コンポーネントで40バイトまで入力可能だった場合、
漢字だと20文字までの幅で表示できましたが、
40文字まで入力可能になったことで、倍の表示幅が必要になります。

入力値を印刷するなどしている場合、
印刷時に印字されない文字列が生じるので注意してください。



以上の処置で対応完了です。



CP932で表示できない文字


?、?、?、?、?、?、?、?、?、
‖、〜、?、?、、−、−、?、?、?、
?、?、?、?、?、?、?、?、?、?、
?、?、?、?、?、?、?、?、?、?、
?、?、?、?、?、?、?、?、?、?、
?、?、?、?、?、?、?、?、?、?、
?、?、?、?、?、?、?、?、?、?、
?、?、?、?、?、?、?、?、?


特に、?と‖が表示できるようになり、
かなり便利になった感があります。

この記事へのコメント
コメントを書く

お名前: 必須項目

メールアドレス: 必須項目


ホームページアドレス: 必須項目

コメント:

認証コード: 必須項目

※画像の中の文字を半角で入力してください。

この記事へのトラックバックURL
https://fanblogs.jp/tb/4398977

この記事へのトラックバック
Build a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: