文字をバイト単位で読み出し、
外字の文字列には、処理を行なうことを考えています。
(外字 … F040〜F9FC 該当する文字列)
文字単位に抜き出せるWideStringを利用しようと考えていますが、
WideStringの場合、得られるバイト文字??が実際のバイトコードと
かけ離れたものになります。 (下記参照)
外字かどうか判別できればよいので、
得に問題はないだろうと思っているのですが、
何故、このようにかけ離れたバイトコードになるのでしょうか?
[参考]
https://www.petitmonte.com/bbs/answers?question_id=1266
--- WideString と String の比較 ---
var
ws : WideString;
s : String;
begin
s := #$F0 +#$40 + #$F9 + #$FC; //F040とF9FC
ws := s;
//WideString
for i := 1 to Length(ws) do
ShowMessage('ws['+IntToStr(i)+'] = '+ InttoHex(Ord(ws[i]),1));
//String
for i := 1 to Length(s) do
ShowMessage('s['+IntToStr(i)+'] = '+ InttoHex(Ord(s[i]),1));
end;
------------------------------------
実行結果
//WideString
ws[1]=E000
ws[2]=E757
//String
s[1] = F0
s[2] = 40
s[3] = F9
s[4] = FC
> 外字かどうか判別できればよいので得に問題はないだろう
[追記]
StrToInt('$'+InttoHex(Ord(ws[i]),1)) の結果が、
57344 (E000) 〜 59223 (E757)であれば、
外字と判断し処理しようと思っています。
WideString と string ではそもそも文字コードが違っていることをご存じないのですか
理解できていません…。
WideStringは、
半角・全角全ての文字を内部で2バイトで扱うので、
全角文字を2バイトで一文字と処理しなくてもよいというくらいしか…
「便利だなぁ」くらいしか考えていませんでした。
ヘルプを見て調べてみました。
この理解であっているかチェックしてもらえますか?
--- 以下、WideStringとStringの違い ---
AnsiChar と WideChar が基本文字型です。
「String」
1.AnsiChar(1バイト)が基本文字型
2.拡張ASCII文字セットに従って順序付け
「WideString」
1.WideChar(1ワード=2バイト)が基本文字列型
2.Unicode 文字セットに従って順序付け
3.Unicode の先頭から 256 文字が ANSI 文字に対応
WideStringの3.の特長から、
半角・全角を区別せず、文字単位での処理が可能
以下の例では、「abc/」はANSI文字に対応しているので、
Stringでの処理と同じバイトコードを表示
「あいう」は、ANSI文字対応でないので
Unicode文字セットの位置を表示している。
--- サンプル ---
ws := 'abcあいう/';
//WideString
for i := 1 to Length(ws) do
ShowMessage('ws['+IntToStr(i)+'] = '+ InttoHex(Ord(ws[i]),1));
--- 実行結果 ---
ws[1] = 61 //ANSIに対応
ws[2] = 62 //ANSIに対応
ws[3] = 3042 //Unicode文字セットの位置
ws[4] = 3044 //Unicode文字セットの位置
ws[5] = 3046 //Unicode文字セットの位置
ws[6] = 2F //ANSIに対応
参考になりそうなページを
紹介してみます。
私が読めるくらいなので、読みやすいと思います。
[Delphi:45937] Re: Unicode でのファイル保存
http://www2.big.or.jp/~osamu/Delphi/browse.cgi?index=45937
UCS-2とUTF-8
http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm
Delphi小技
http://homepage3.nifty.com/m-and-i/tips/tipspage.htm
Fusaさんありがとうございます。
詳細頂いたサイトを読み直し、
再度WideStringとStringの違いをまとめてみたいと思います。
ツイート | ![]() |