こんばんは。
最近、質問が続いていますが、よろしくお願いします。
日本語の前後についている””を削除すると文字化けします。
文字化けしないように削除する方法はありませんか??
repeat
k:=pos('"',s);
if k>0 then Delete(S,k,length('"'));
until k=0;
"こんばんは"→こんばんは
ウィンドウズ8,10で、XE5です。
StringReplace 関数を使うのは、いかがですか?
S := StringReplace(S, '"', '', [rfReplaceAll]);
igyさん、ありがとうございます。
早速、試してみます。
S := S.DeQuotedString(");
でどうでしょう?
質問を見直してみると、最初に挙げたコード自体、実行しても文字化けしないような気が・・・
実は
var
S: AnsiString;
だったりして…
環境が書いてないので,
「最近よく質問しているのだから,調べればわかるでしょう」
と言ってような気がしたので調べました.
Delphi XE5 をお使いのようですので.
procedure TForm1.Button1Click(Sender: TObject);
var
LText : string;
begin
LText := '"日本語"';
LText := AnsiDequotedStr(LText, '"');
ShowMessage(LText);
end;
動作確認は Windows 7 U64(SP1) + Delphi XE5(UP2) Pro です.
このぐらいのコードなら,省略しないで,全部書いてもバチは当たらないと思いますが.
あっ,そうか.何万行のプログラムの一部だから省略したコードが提示できないんですね (笑)
>日本語の前後についている””を削除すると文字化けします。
引用符の一種で「ダブルクォーテーション」と言います.
用語を知らないと検索もできませんし,会話もスムーズにいかないことがあります.
もちろん " で検索してもおそらく意味を知ることはできるのではないかと思います.
皆さん、ありがとうございます。
私の知人が、Mr.XRAYさんのHPを見て作ってくれてましたので、
ここに紹介しておきます。
Enc := TEncoding.GetEncoding(CP_UTF8);
S1 := TStringList.Create;
try
S1.LoadFromFile(FileName,Enc);
for i := 0 to S1.Count-1 do
begin
Stocks1[i]:=S1[i];
S:= Stocks1[i];
while pos('"',S) >0 do
begin
J := pos('"',S);
Delete(S,J,Length('"'));
end;
Stocks1[i]:=S;
filecut(15,Stocks1[i]);
for j:=1 to 15 do Stocks2[i,j]:=cutf[j];
end;
StocksNo:= S1.Count-1;
finally
Enc.Free;
S1.Free;
end;
私が実行したところでは、最初のコードでも、memo1上では文字化けしません。
保存しても、それを読み込んでも文字化けしません。
ただ、変数に読み込むと文字化けして困っていたのです。
私がコードを早く上げておけば、皆さんにご迷惑をおかけしなくて良かったのですが、
解決だけではと思っています。
Mr.XRAYさんへ
今回は環境書いていますよ。
””は読み方は分かりますよ。
この問題は何万行のプログラムの一部ではありません。
それの補助用の208行のプログラムです。
とにかく、今回はmemo1上では異常はなく、保存して読み込んでも異常がなく、
なので、苦労しました。
XRAYさんのお蔭です、ありがとうございました。
質問の綴りが間違っていましたね??
最初の質問では、
> 日本語の前後についている””を削除すると文字化けします。
だったのが、
> ただ、変数に読み込むと文字化けして困っていたのです。
になってますね。
どうも、問題の切り分けが必要なようです。
> 私の知人が、Mr.XRAYさんのHPを見て作ってくれてましたので、
> ここに紹介しておきます。
コードの一部の紹介ではなく、
文字化け が発生するコード(他の人でも再現可能なコード) を
ASさん自身で作成して、ここに挙げてみるのは、いかがですか?
文字化けの質問した時は、自分のプログラムで外して文字化けが起こっていたのです。
その後、memo1上で試してみて、何で?と。
igyさんに紹介されたreplaceもmemo1上で試してみて、何で?と。
いろいろ試して、読み込むときに文字化けするという事実に。
知人に作ってもらったプログラムもあるのでいいかと??
諦めました。
memo1.Lines.LoadFromFile(filename);
s:=memo1.Text;
S := StringReplace(S, '"', '', [rfReplaceAll]);
memo1.Text:=S;
memo1.Lines.SaveToFile(filename);
自作のfilerでこの保存したのを読み込んでも、文字化けは起こしていません。
しかし、上の修正前の読み込み方法では文字化けするんですよ。
最初から””のついていないfileを読み込んだら、文字化けは起こりません。
外したのと比較すると、memo1上では全く同じに見えます。
encを使ったので文字化けが消えたのだと思いますが、何故??という疑問は
残っています。
””のついたファイルを無理やりエクセルにと見込んだら””が消えたデータを
表示します。
それを保存したら、””のないファイルができます。
これを修正前の読み込み法で変数に読み込んだら、正常に読み込みます。
先に書いた方法で無理に消すと、表面上は全く変わらないのに、
修正前の読み込み法で変数に読み込んだら文字化けします。
ということで、相当悩みましたが、まあ文字化けは消えてるのでいいか
と諦めてるわけです。
変更後のと比べると、ENCを使ってない、tryを使ってない
とこくらいだと思います。
よろしくお願いします。
procedure FileGet(S:string);
var
FileName,InBuff:string;
F:textfile;
j,i:integer;
begin
FileName := S;
if not FileExists(FileName) then
begin
showmessage(FileName+'が見つかりません');
exit;
end ;
AssignFile(F, FileName); Reset(F);
i:=0;
repeat
inc(i); readln(F,InBuff); St1[i]:=Inbuff;
filecut(5,inbuff);
for j:=1 to 5 do St2[i,j]:=cutf[j];
until eof(f);
StNo:=i;
CloseFile(F);
end;
> 変更後のと比べると、ENCを使ってない、tryを使ってない
> とこくらいだと思います。
> よろしくお願いします。
これ、他の人の環境では、コンパイルでエラーが出ますし、文字化けの再現方法もわかりませんよね。
繰り返しになりますが、
文字化け が発生するコード(他の人でも再現可能なコード) を
ASさん自身で作成して、ここに挙げてみるのは、いかがですか?
上に書いたコードを完全にコンパイルできるようにしてほしいという意味でしょうか??
それとも、エラーの出るデータを作って欲しいという意味しょうか?
文字化けするデータは、VBなどで文字列をcsvファイルとして保存したらできますが、
私は今VB勉強中なので、提示は出来ません。
コンパイル可能なコードは今から作って後で、書き込みます。
では、では。
作りました。
よろしくです。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FileGet(S:string);
procedure FileCut(v:integer; b:String);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
St:array[1..9999,1..15] of string;
CutF:array of string;
StNo:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
S,s1,FileName : string;
i,J,K:integer;
begin
Filename:=Edit1.text;
memo1.Lines.LoadFromFile(filename);
s:=memo1.Text;
S := StringReplace(S, '"', '', [rfReplaceAll]);
memo1.Text:=S;
memo1.Lines.SaveToFile(filename);
showmessage('もう一度LoadFromFileで読み込みます。');
memo1.Lines.LoadFromFile(filename);
showmessage('分解しながら読み込んで繋ぎ合わせます。');
memo1.Lines.clear;
FileGet(filename);
for I :=1 to StNo do
begin
s1:='';
for j:=1 to 5 do s1:=s1+St[i,j]+',';
memo1.lines.add(S1);
end;
end;
procedure Tform1.FileGet(S:string);
var
FileName,InBuff:string;
F:textfile;
j,i:integer;
begin
FileName:=S;
if not FileExists(FileName) then
begin
showmessage(FileName+'が見つかりません');
exit;
end ;
AssignFile(F, FileName); Reset(F);
i:=0;
repeat
inc(i); readln(F,InBuff);
filecut(5,inbuff);
for j:=1 to 5 do St[i,j]:=cutf[j];
until eof(f);
StNo:=i;
CloseFile(F);
end;
procedure Tform1.FileCut(v:integer; b:String);
var
i,j:integer;
q:string;
begin
q:=b+',';
setlength(CutF,v+1);
for i:=1 to v do
begin
j:=pos(',',q);
CutF[i]:=Copy(q,0,j-1);
q:=copy(q,j+1,length(q)-j);
if (q='') and (i<>V) then exit;
end;
end;
end.
> 上に書いたコードを完全にコンパイルできるようにしてほしいという意味でしょうか??
いいえ。違います。
> それとも、エラーの出るデータを作って欲しいという意味しょうか?
問題を解決したいのであれば、
文字化けやエラーが再現できる必要最小限のコードを(必要ならデータも)、ここに挙げれば、
この掲示板を見ている人も検証できて解決につながるということです。
> 文字化けするデータは、VBなどで文字列をcsvファイルとして保存したらできますが、
エラーを起こすと思われる 検証用のCSVファイルを、テキストエディタとかで書いたり、できそうな気もしますけど。
AssignFileとか古いファイルIO関数は使わないのでアレなのですが、AssignFileとかReadLnってUTF-8をきちんと
扱えるんでしたっけ?ANSI専用だったような記憶が…
ASさんが書いた内容が、わかりにくかったのですが、
> 私の知人が、Mr.XRAYさんのHPを見て作ってくれてましたので、
> ここに紹介しておきます。
これは、
ASさんの知人が作成した UTF-8のファイルを正しく読めるプログラムを、問題の箇所と置き換えて、解決した。
という意味だったのですね。
ということで、
> コードの一部の紹介ではなく、
> 文字化け が発生するコード(他の人でも再現可能なコード) を
> ASさん自身で作成して、ここに挙げてみるのは、いかがですか?
は、不要でしたね。失礼しました。
> AssignFileとかReadLnってUTF-8をきちんと 扱えるんでしたっけ?
たぶん、これですね。原因は。
UTF-8のファイルを読み込むことは、ASさんの知人が作った、
> Enc := TEncoding.GetEncoding(CP_UTF8);
の箇所で判明しましたが、ファイルがUTF-8という情報は、
質問の最初にでも書いていたら、解決が早かったかもですね。
通りすがりさんへ
古いプログラムが残っていて、それを使う続けているので、
こうなっています。
ただ、普通のファイルは読み込めますよ。
ブロックリードは危険だという警告が出ていますが、使い続けています。
変え方が分からないんですよね。
ツイート | ![]() |