[delphi-users:2392] 漢字文字列が文字化け・・

758 views
Skip to first unread message

遊歩人

unread,
Jan 19, 2012, 8:11:56 PM1/19/12
to DelphiML
みなさん、こんにちは。

何時もお世話になります。

SQL文をパースする処理を以下のようにコーディングしてあります。
ほとんど期待通りの結果が出力されますが、アポストロフィー(')で囲まれた漢字文
字列が文字化けします。
UNICODEの関係かと思いますが、ご教授宜しくお願いいたします。

動作環境は、次の通りです。
・Delphi XE Ent
・Windows7 64bit

procedure ParseProc(const Str: String; StrList: TStrings);
const
SP = #$0020; // 半角スペース
TAB = #$0009; // TAB
Delimiters: TSetOfChar =
[SP,'.',',',';','/','(',')','<','>','|','+','-','*'];
var
StrStream: TStringStream;
Eof: Boolean;
Buffer, Token, S: String;
begin
if (Str = '') then Exit;

// 不要な文字をスペースに変換
S := RemoveCRLF(Str);
S := StringReplace(S , ' ', SP, [rfReplaceAll]);
S := StringReplace(S , TAB, SP, [rfReplaceAll]);

// 初期処理
StrStream := TStringStream.Create(S);
StrList.Clear;
Eof := False;
Declare := False;
Token := '';

// メイン処理
while not Eof do
begin
Eof := StrStream.Position >= StrStream.Size-1;
Buffer := StrStream.ReadString(1);

// 区切り文字か?
if (Buffer[1] in Delimiters) then
begin
if Token <> '' then StrList.Add(Token);
Token := '';
end
else
Token := Token + Buffer[1];
end;

// 終了処理
StrStream.Free;
end;


遊歩人


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
使い方はいろいろ♪一部のメンバーだけにMLメールを送ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hLYwP
------------------------------------------------------[freeml byGMO]--

Mr.XRAY

unread,
Jan 20, 2012, 9:46:12 AM1/20/12
to delphi...@freeml.com
[delphi-users:2392] 漢字文字列が文字化け・・ へのレスです.

こんにちは.
以下のコードではどうでしょうか.
// 不要な文字をスペースに変換
の部分は省略しています.

type
TSetOfChar = Set of Char;

function Split(const Str: String; StrList: TStrings): Integer;
const
Delimiters : TSetOfChar = [' ','.',',',';','/','(',')','<','>','|','+',
'-','*'];
var
SS : String;
i : Integer;
iSt : Integer;
begin
StrList.Clear;
Result := 0;
if Length(Str) < 1 then exit;

SS := Str;
iSt := -1;
for i := 1 to Length(SS) do begin
if CharInSet(SS[i], Delimiters) then begin
if iSt <> -1 then begin
StrList.Add(Trim(Copy(SS, iSt, i - iSt)));
iSt := -1;
end
end else begin
if iSt = -1 then iSt := i;
end;
end;

if iSt <> -1 then StrList.Add(Trim(Copy(SS, iSt, Length(Str))));
Result := StrList.Count;
end;


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メンバーで使える掲示板を活用しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hMkL6
------------------------------------------------------[freeml byGMO]--

Mr.XRAY

unread,
Jan 20, 2012, 4:13:11 PM1/20/12
to delphi...@freeml.com
[delphi-users:2393] Re: 漢字文字列が文字化け・・ へのレスです.

こんにちは.Mr.XRAYです.
失礼しました.修正です.CharInSetを使うのだから,TSysCharSetですね.
動作確認は,Windows XP(SP3) + Delphi XEです.

function ParseProc(const Str: String; StrList: TStrings): Integer;
const
Delimiters : TSysCharSet = [' ','.',',',';','/','(',')','<','>','|','+


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=hMmhw
------------------------------------------------------[freeml byGMO]--

遊歩人

unread,
Jan 20, 2012, 10:27:31 PM1/20/12
to delphi...@freeml.com
Mr.XRAY さん、こんにちは。

早々のリプライありがとうございます。
確かに漢字文字列が、文字化けせずに正しく返ってきます。

Mr.XRAY さんとの違いは、
 ①区切り文字の判定でinの代わりに、「CharInSet関数」を使用。
 ②トークンの切り出しに「Copy関数」を使用。
の2点かと思います。

私のコーディング例でも、デバッグ・モードで各変数の値を見ても正しくチップアッ
プされてきます。
しかし、漢字文字列だけが正しく切り出せずに文字化けしてしまいます。

昨日のセミナーで次の様な事例が紹介されていました。

const
x1 = 'a';
x2 = 'あ';
x3 = 'ア'; <-----①

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(SizeOf(x1)) +
IntToStr(Length(x2)) +
IntToStr(SizeOf(x3)));
end;

実行すると「211」が表示されます。
私のようなバイトの世界から抜け出られない人間だと、
x1もx3も「1byte」と思いますから、当然答えは「121」になるだろうと思ってしま
います。
なぜ「日本語の半角カタカナ」だけが違うの・・?

ところが①の部分を
x3: WideChar = 'ア';
に変えると「212」と表示されます。

話を元に戻しますと、文字列処理で配列的な処理をするケースは多々あると思います
が、
この様な場合は、Mr.XRAYさんの様な処理をしないと正しく値が返らないということ
でしょうか?

UNICODEの違いがいまいち理解できていないのですが、少し解説を頂けると助かりま
す。

宜しくお願いいたします。

遊歩人


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
練習や試合の予定調整は「とっとと決め太郎」におまかせ!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hMq4w
------------------------------------------------------[freeml byGMO]--

Mr.XRAY

unread,
Jan 21, 2012, 2:49:43 AM1/21/12
to delphi...@freeml.com
[delphi-users:2395] Re: 漢字文字列が文字化け・・ へのレスです.

こんにちは.

>UNICODEの違いがいまいち理解できていないのですが、少し解説を頂けると助かりま

解説なんてことはできませんが,

Delphiの製品情報
http://ht-deko.minim.ne.jp/Delphi/

の真ん中のフレームの一番下の[情報]をクリックします.
いろいろな参考リンクがあります.この中でDelphi 2009とか,Unicode
関係の記事が参考になるのではないかと思います.

私自身はUnicode化されて嬉しかったですね.
世の中既にUnicodeの世界になっていましたから.
「これで,文字列が文字単位で扱えるんだ!!」と.
先頭のバイトが何々の時は,漢字コードだから,なんて複雑な処理は,
頭の悪い私には向いていません.


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
毎日豪華プレゼントキャンペーン開催中!くまポン
http://ad.freeml.com/cgi-bin/sa.cgi?id=hMt55
------------------------------------------------------[freeml byGMO]--

きたんご

unread,
Jan 21, 2012, 3:19:06 AM1/21/12
to delphi...@freeml.com
北畑と申します。
横から失礼します。

DELPHI 2009 HANDBOOK Delphi最新プログラミングエッセンス
ISBN 978-4-87783-222-3
という本にもUNICODEについて詳しく解説があります。

私は、この本でDelphiのUNICODEが分かったつもりになっています。


--
Hiroaki Kitahata <kita...@wingcomputer.com>

-----
No virus found in this message.
Checked by AVG - www.avg.com
Version: 2012.0.1901 / Virus Database: 2109/4756 - Release Date: 01/20/12


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
使い方はいろいろ♪一部のメンバーだけにMLメールを送ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hMtSc
------------------------------------------------------[freeml byGMO]--

Mr.XRAY

unread,
Jan 22, 2012, 3:11:17 AM1/22/12
to delphi...@freeml.com
[delphi-users:2396] Re: 漢字文字列が文字化け・・ へのレスです.

こんにちは.Mr.XRAYです.

>「これで,文字列が文字単位で扱えるんだ!!」と.

正確に言うと,先に提示したコードもそうですが,Unicodeに完全に対応して
いるとは言えません.詳しくは「サロゲートペア, ElementToCharLen」等を
検索してみてください.
20日のセミナーで詳しい説明があったかも知れませんが.

参考までに,以下のコードは4を返します.

procedure TForm1.Button1Click(Sender: TObject);
var
S : String;
begin
S := '東';
ShowMessage(IntToStr(SizeOf(S)));
end;


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メンバーで使える掲示板を活用しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hM5iL
------------------------------------------------------[freeml byGMO]--

hirodel

unread,
Jan 23, 2012, 4:30:34 AM1/23/12
to delphi...@freeml.com
加藤です。 いつもお世話様です。

環境
Delphi7 Ente sp1
Windows7 64bit
以前(WindowsXP)からなのですが、Delphi7の終了時にエラーが出てDekphi32.exeのプロセスが終了出来なくなります。
作業中にデバッグエラーを起こすと必ずと言って良いほど出てしまいます。
デバッガオプションはdefaultのまま使ってますが、デバッガオプションの何処かの設定が間違ってるのでしょうか?
WindowsXPからWindows7にしてから以前より起こりにくくなったような気がしますが・・・。
Delphi7以外のヴァージョンでは全く起こりません。

宜しくお願いいたします。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
練習や試合の予定調整は「とっとと決め太郎」におまかせ!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hMKmf
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages