WideStringはどのようにバイトを処理しているのですか?


maco  2005-10-01 02:33:38  No: 17806

文字をバイト単位で読み出し、
外字の文字列には、処理を行なうことを考えています。
(外字 … 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


maco  2005-10-01 02:41:27  No: 17807

> 外字かどうか判別できればよいので得に問題はないだろう

[追記]
  StrToInt('$'+InttoHex(Ord(ws[i]),1)) の結果が、
  57344 (E000) 〜 59223 (E757)であれば、
  外字と判断し処理しようと思っています。


えーと  2005-10-01 04:11:50  No: 17808

WideString と string ではそもそも文字コードが違っていることをご存じないのですか


maco  2005-10-01 06:04:23  No: 17809

理解できていません…。

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に対応


Fusa  2005-10-01 07:37:28  No: 17810

参考になりそうなページを
紹介してみます。

私が読めるくらいなので、読みやすいと思います。

[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


maco  2005-10-03 16:43:37  No: 17811

Fusaさんありがとうございます。

詳細頂いたサイトを読み直し、
再度WideStringとStringの違いをまとめてみたいと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加