2015年11月12日
猿でもできる!システム開発者が陥るCP932、Unicode、シフトJIS問題。
シフトJIS
Shift_JIS(シフトジス)は、コンピューター上で日本語を含む文字列を表現するために用いられる文字コードの一つ(Wikipedia引用)
さらに、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で表示できない文字
內、㎥、鷗、嶲、殩、瓯、籩、鳦、骶、
‖、〜、한、글、、−、−、㐂、㉑、𠀋、、
侮、僧、免、勉、勤、卑、喝、嘆、器、塀、
墨、層、屮、悔、慨、憎、懲、敏、既、暑、
梅、海、渚、漢、煮、爫、琢、碑、社、祉、
祈、祐、祖、祝、禍、禎、穀、突、節、練、
縉、繁、署、者、臭、艹、艹、著、褐、視、
謁、謹、賓、贈、辶、逸、難、響、頻
特に、㎥と‖が表示できるようになり、
かなり便利になった感があります。
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
no image
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/4398977
この記事へのトラックバック