2012-12-13 2 views
0

내가 문자를 교체하려고 (진수 값 197)를 사용하여 UTF-8 파일에서 유니 코드 문자를 교체 (진수 값 65) 그것은 문자열문자와 UTF-8 파일에서 델파이 2010

SS := TStringStream.Create(ParamStr1, TEncoding.UTF8); 
SS.LoadFromFile(ParamStr1); 
//S:= SS.DataString; 
//ShowMessage(S); 

그러나, 내가 어떻게 65 모든 197 년대를 교체하는 (즉, 비록 할 필요가 없습니다 수 있습니다), 그리고 UTF-8로 다시 밖으로 저장?

SS.SaveToFile(ParamStr2); 
SS.Free; 

는 -------------- EDIT ----------------

reader:= TStreamReader.Create(ParamStr1, TEncoding.UTF8); 
writer:= TStreamWriter.Create(ParamStr2, False, TEncoding.UTF8); 

while not Reader.EndOfStream do 
begin 
    S:= reader.ReadLine; 
    for I:= 1 to Length(S) do 
    begin 
    if Ord(S[I]) = 350 then 
    begin 
    Delete(S,I,1); 
    Insert('A',S,I); 
    end; 
    end; 
    writer.Write(S + #13#10); 
end; 

writer.Free; 
reader.Free; 
+0

UTF-8은 1 개 바이트 길이 그래서 진수 값 (300)은 불가능하다가 대리가 아닌 : 사실 인 경우 디코딩 된 UTF-8 데이터 후 StringReplace()를 호출 할 때, 단순히 Ş으로 Å 대체 이 경우 문자를 나타내는 코드 포인트 또는 개별 바이트에 대해 이야기하는 것이 좋습니다. 어쨌든, 당신의 목표는 당신의 [다른 질문]과 관련이 있기 때문입니다. (http://stackoverflow.com/questions/13864643/reading-a-text-file-as-bytes-byte-by-byte -using-delphi-2010) – jachguate

+5

아무 것도 이해가되지 않습니다. 이 질문이나 다른 질문. 당신은 [XY 질문] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)으로 알려진 것을 묻습니다. 나는 당신에게 우리에게 뒷 이야기를 할 것을 강력히 권합니다. 근원적 ​​인 문제를 말해주십시오. 해결책을 제안하겠습니다. 제안하는 솔루션이 약해진다. –

+1

평범한 오래된 'StringReplace'의 문제점은 무엇입니까? –

답변

6

진수 197 헥사이다 C5 , 십진수 65은 16 진수 41입니다.

C5은 유효한 UTF-8 옥텟 자체가 아니지만 41입니다. 그래서 실제로는 유니 코드 코드 포인트를 U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVEU+0041 LATIN CAPITAL LETTER A 대신 사용한다고 가정해야합니다.

U+00C5C3 85으로 UTF-8로 인코딩되고 U+004141으로 인코딩됩니다. 당신이 요구하고있는 것을하기 위해 UTF-8을 해독하고 코드 포인트를 대체 한 다음 UTF-8로 다시 인코딩해야합니다.

reader := TStreamReader.Create(ParamStr1, TEncoding.UTF8); 
writer := TStreamWriter.Create(ParamStr2, False, TEncoding.UTF8); 

while not Reader.EndOfStream do 
begin 
    S := reader.ReadLine; 
    S := StringReplace(S, 'Å', 'A', [rfReplaceAll]); 
    writer.WriteLine(S); 
end; 

writer.Free; 
reader.Free; 

이 업데이트 : 당신이 U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE을 코드 포인트 유니 코드에 실제로 관심이없는 것처럼 다른 의견에 따라, 보이는 것이 아니라

SS := TStringStream.Create('', TEncoding.UTF8); 
SS.LoadFromFile(ParamStr1); 

S := StringReplace(SS.DataString, 'Å', 'A', [rfReplaceAll]); 

SS2 := TStringString.Create(S, TEncoding.UTF8); 
SS2.SaveToFile(ParamStr2); 

SS2.Free; 
SS.Free; 

또는 : StringReplace()는 예를 들면, 그것을 위해 잘 작동합니다 U+015E LATIN CAPITAL LETTER S WITH CEDILLA 대신 UTF-8로 C5 9E으로 인코딩되어 있습니다.

S := StringReplace(S, 'Ş', 'A', [rfReplaceAll]); 
+0

제이크가 U + 015E를 말합니다 –

+0

좋습니다. –