何時もお世話になります。
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]--
こんにちは.
以下のコードではどうでしょうか.
// 不要な文字をスペースに変換
の部分は省略しています.
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]--
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]--
早々のリプライありがとうございます。
確かに漢字文字列が、文字化けせずに正しく返ってきます。
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]--
こんにちは.
>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]--
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です.
>「これで,文字列が文字単位で扱えるんだ!!」と.
正確に言うと,先に提示したコードもそうですが,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]--
環境
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]--