「あなくつ」のおもちゃばこ

Blog

Shift_JISからUnicodeへの変換

  • 変換式はないので、変換テーブルを用いる
  • 変換テーブルはShift-JIS to Unicode(Unicode Consortiumのもの)を用いる
  1. 1バイト取ってくる
  2. 0x00から0x7Dまたは0x7Fなら、単純に2バイト(16ビット)に拡張(ASCII文字)
  3. 0x7Eなら、0x203E(チルダ)
  4. 0xA1から0xDFなら、0xFEC0を加える(半角カタカナ)
  5. 0x81から0x9Fまたは0xE0から0xFCなら、後続1バイトを取ってきて、変換テーブルを用いて文字コードを得る
  6. その他のビット列が来たら知らん(笑)
    REPLACEMENT CHARACTER(0xFFFD)に置換するらしい

UnicodeからShift_JISは真逆の処理をしてあげれば良い。ただし、UnicodeとShift_JISは完全に可換ではないので、欠損する可能性あり。

タグ : Shift_JIS,UTF-16,Unicode,シフトJIS

2011/02/13 17:32:21 | Trackbacks (0) | Comments (0) | Technology

文字コードマニア

もう3日くらい文字コードと戯れています。おかげで文字コードにだいぶ詳しくなってきました。

ISO-2022-JPについて

  • JISコードはエスケープシーケンスでASCII文字のコードか漢字のコードか切り替える
  • 一言にJISコードといっても策定されたバージョンがいくつかある
  • メールなどの普通のJIS文字を扱うなら、1997年のJIS X 0208を相手にしていればOK。
  • 第3水準、第4水準の漢字を含めたJISなら、JIS X 0213(通称:JIS2004、ISO-2022-JP-2004)を使う。
  • JIS X 0213はIANAに登録されていない(Wikipedia調べ)らしいのでメールの標準エンコードとしては使えない。
  • JIS X 0213は下位互換(JIS X 0208を包括)
  • JIS X 0213でエスケープシーケンスが増える。

Unicode(UTF-16)について

  • Unicodeも何回もバージョンアップしているんですね
  • Unicodeへの変換はアルゴリズムではできず、変換テーブルを使う必要がある
  • 変換テーブルは、Unicode Consortiumとかこちらとかにある。
  • JIS X 0213の変換テーブルはこちらなんかがヒットした
  • JIS X 0213の文字までUTF-16に変換しようものならサロゲートペアを考慮しなければならない
  • Windows VistaからサロゲートペアのUTF-16も扱っているから、プログラム書くときは結局このあたりも考慮しなければならない
  • サロゲートペアってのは4バイト(UTF-16文字*2文字)使って1文字を表す方法。Ansi文字における2バイト文字みたいなものか?(ってか結局2文字かよ!Unicodeになっても後続文字かどうかを判別しなければならないなんて...)
  • ちなみにDelphiでサロゲートペアを考慮するときはEmbarcaderoのページが役立つと思う

タグ : ISO-2022-JP,JIS,UTF-16,Unicode,サロゲートペア

2009/11/07 07:28:41 | Trackbacks (0) | Comments (0) | Technology

Delphiについていろいろ考え中

最近はLazarus使ってFreePascalでプログラム書いているのだけれど、せっかくクラスとか書いたら公開したいなぁと思うわけです。ところで、時代はDelphi 2010なわけで、Delphiで扱う文字列がUnicodeになっているわけです。そこで気にしたいのは、バイト単位で文字列を操作する部分はUnicodeとAnsiどちらでも動くようにするということ。

まぁぶっちゃけるとMIMEの処理を行いたいわけだけど、ISO-2022-JPの文字列をstringに突っ込むとどうなるんだろうとか、Base64のエンコード・デコードをしたときにデータを格納すべき変数のデータ型は?とかが、いろいろ分からないのです。データを全部TStream系とかarra of Byteか何かで処理すれば気にしなくていいんだけれど、そうすると文字列検索なんかが面倒になる。ちなみにIndyとかはarray of ByteをTBytesとして宣言して使っているっぽい。

まぁこんな感じで悶々と考えたわけだけれど、結論としてDelphi 2009以降がないとわからん!ってことであきらめました。とりあえずstringはすべてAnsiStringとして考えておくことにします。

タグ : Base64,Delphi,FreePascal,Lazarus,MIME,Unicode

2009/11/05 03:21:01 | Trackbacks (0) | Comments (0) | Technology

Delphiについていろいろ考え中

最近はLazarus使ってFreePascalでプログラム書いているのだけれど、せっかくクラスとか書いたら公開したいなぁと思うわけです。ところで、時代はDelphi 2010なわけで、Delphiで扱う文字列がUnicodeになっているわけです。そこで気にしたいのは、バイト単位で文字列を操作する部分はUnicodeとAnsiどちらでも動くようにするということ。

まぁぶっちゃけるとMIMEの処理を行いたいわけだけど、ISO-2022-JPの文字列をstringに突っ込むとどうなるんだろうとか、Base64のエンコード・デコードをしたときにデータを格納すべき変数のデータ型は?とかが、いろいろ分からないのです。データを全部TStream系とかarra of Byteか何かで処理すれば気にしなくていいんだけれど、そうすると文字列検索なんかが面倒になる。ちなみにIndyとかはarray of ByteをTBytesとして宣言して使っているっぽい。

まぁこんな感じで悶々と考えたわけだけれど、結論としてDelphi 2009以降がないとわからん!ってことであきらめました。とりあえずstringはすべてAnsiStringとして考えておくことにします。

タグ : Base64,Delphi,FreePascal,Lazarus,MIME,Unicode

2009/11/05 03:21:01 | Trackbacks (0) | Comments (0) | Technology

  • Top
  • Software
  • Blog
  • Laboratory
  • Profile
Search
Feeds of Blog
Archives

Copyright © 2004-2024 Ana-Kutsu All Rights Reserved.