2013-09-26 3 views
-1

다른 인코딩 (ASCII, UTF-8, UTF-16, UTF-32)이 가능한 텍스트 파일이 있습니다. 가장 좋은 부분은 예를 들어, 숫자 만 가득이다 :유니 코드를 ascii로 변환

192848292732

내 질문은 다음과 같은 기능이 제대로 모든 데이터를 표시 할 수 우는 것인가? 이유가 없다면? (필자는 컨테이너 문자열로 문자열로 파일을로드 한)

function output(container: AnsiString): AnsiString; 
var 
    i: Integer; 
begin 
    Result := ''; 
    for i := 1 to Length(container) do 
    if (Ord(container[i]) <> 0) then 
     Result := Result + container[i]; 
end; 

내 논리는 인코딩이 다음 ASCII와 UTF-8 추가 문자가 다른 경우 모두 0 점이다?

모든 테스트를 통과합니다.

+2

문자열이란 무엇입니까? AnsiString 또는 UnicodeString? 어떻게하면 델파이 버전을 지정하지 않고도 유니 코드 질문을 할 수 있습니까?! BOM을 어떻게 처리 할 것을 제안합니까? –

+0

@DavidHeffernan 나는 델파이 7을 사용합니다. String은 AnsiString 마녀가 파일에서로드 된 바이트를 포함하고 0은 바이트 0을 나타냅니다. 바이트 0은 위조라고 가정하고 깨끗한 아스키 문자열을 제거합니다. 이게 옳은 거니 ? – opc0de

+0

@SertacAkyuz 예 질문에 따라 질문을 편집하겠습니다. – opc0de

답변

3

ASCII 문자 집합은 코드 0-127을 사용합니다. 유니 코드에서이 문자는 동일한 숫자 값을 갖는 코드 포인트에 매핑됩니다. 따라서 각 인코딩이 코드 포인트 0-127을 나타내는 방법에 대한 질문이 내려집니다.

  • UTF-8은 코드 포인트 값을 포함하는 단일 바이트로 코드 포인트 0-127을 인 코드합니다. 즉, 페이로드가 ASCII 인 경우 ASCII와 UTF-8 인코딩간에 차이가 없습니다.
  • UTF-16은 코드 포인트 0-127을 2 바이트로 인코딩하며 그 중 하나는 0이고 다른 하나는 ASCII 코드입니다.
  • UTF-32는 코드 포인트 0-127을 4 바이트로 인코딩하며 그 중 3 개는 0이고 나머지 바이트는 ASCII 코드입니다.

제안 된 알고리즘은 ASCII 코드 0 (NUL)을 감지하지 못합니다. 그러나 그 캐릭터가 그 파일에 존재하지 않는다고 말하면됩니다.

제안 된 코드에서 볼 수있는 유일한 다른 문제는 바이트 순서 표시 (BOM)를 인식하지 못한다는 것입니다. 이러한 파일의 시작 부분에있을 수 있습니다 그리고 나는 당신이 그들을 감지하고 건너 뛴다 고 생각합니다.

이 모든 것을 말하면 구현이 이상하게 보입니다. 파일에 숫자 만 들어 있다고 나와 있습니다. 이 경우 테스트는 동일하게 수 :

if container[i] in ['0'..'9'] then 
    ......... 

당신이 그때 당신은 또한 BOM을 건너 뛸 일어날 것이라고이 코드를 사용하는 경우가 참석했다.

+0

귀하의 도움에 감사드립니다. – opc0de

+2

@DavidHeffernan : [ '0'.. '9'] '에'container [i] '라고 써야하지 않습니까? –

+0

@HeartWare가 편집 해 주셔서 감사합니다. –

관련 문제