델파이 7의 유니 코드 문자를 ASCII 코드로 어떻게 변환하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/305162

  •  08-07-2019
  •  | 
  •  

문제

예, 우리는 ASCII 코드에 대해 이야기하고 있습니다. 내 Appologies 나는 여기 Delphi Dev가 아닙니다.

도움이 되었습니까?

해결책

Delphi 7의 경우, 나는 얻을 것이다 Mike Lischke의 무료 유니 코드 라이브러리 Virtual TreeView의 저자는 누구입니까?

Libary에는 유니 코드를 오가는 많은 변환 기능이 포함되어 있으므로 응용 프로그램에서 가장 적합한 것을 사용할 수 있습니다.

또는 Delphi 2009로 업그레이드 할 수 있습니다 인코딩 루틴이 내장되어 있으며 자체 변환 기능 라이브러리가 있습니다.

다른 팁

몇 가지 똑바로 봅시다. 문자 세트 (숯) 및 문자 인코딩은 두 가지 관련이지만 다른 개념입니다. 문자 세트는 일종의 정수 문자 코드를 가진 문자의 추상 목록입니다. 그런 다음 문자 인코딩이 있습니다. 기본적으로 문자가 바이트로 표시되는 방법을 설명하는 알고리즘입니다.

ASCII 문자 세트와 인코딩으로 작용합니다. 7 비트를 사용하여 128 자 (94 인쇄 가능)를 표현합니다. 유니 코드 반면에 1,114,112 코드 포인트를 표현하는 캐릭터 세트가 있습니다. 유니 코드 스트링을 나타내는 몇 가지 인코딩이 있지만 가장 주목할만한 것은 UTF-8, UTF-16, UTF-16LE 및 UTF-32입니다. 다시 말해, 단일 유니 코드 문자는 인코딩에 따라 다른 방식으로 표현 될 수 있습니다.

델파이 7의 유니 코드 문자를 ASCII 코드로 어떻게 변환하려면 어떻게해야합니까?

질문은 두 가지 방식으로 해석 될 수 있다고 생각합니다.

  1. ASCII 인쇄용 문자 만 포함하는 인코딩에 유니 코드 문자열이 있습니다. 문자열을 ASCII 인코딩의 바이트 배열로 어떻게 변환 할 수 있습니까?

  2. 일부 인코딩에는 중국어와 같은 ASCII가 아닌 인쇄용 문자도 포함하는 유니 코드 문자열이 있습니다. 정보를 잃지 않고 문자열을 ASCII 인코딩으로 인코딩하고 나중에 원래 유니 코드 문자열로 다시 해독하려면 어떻게해야합니까?

첫 번째를 의미한다면 Osman이 말하는 것처럼 유니 코드 문자열을 넓은 상태로로드 할 수 있습니다.

var
  original: WideString;
  s: AnsiString;
begin
  s := AnsiString(original);

두 번째를 의미한다면, 당신은 다음과 같은 일반 인코딩 알고리즘이 필요합니다. 베이스 64 부호화. 당신이 사용할 수있는 dcpbase64.pas David Barton 's에 포함되어 있습니다 DCPCrypt v2 베타 3.

전환의 정의가 무엇인지에 따라 다릅니다. 127 개의 가장 낮은 문자를 유니 코드 동등성에 매핑하려면 명시 적 캐스트를 사용할 수 있습니다. 그러나 문자열에 더 많은 문자가 포함되어 있으면 쓰레기가 생성됩니다.

ë-> e 및 û-> u와 같은 매핑을 원한다면 자신의 코드를 작성할 수 있습니다. 그러나 변환 할 수없는 캐릭터가 항상 있다는 점에 유의하십시오.

"ASCII"는 문자를 숫자에 특정한 매핑의 이름이지만, 어떤 사람들은 실제로 ASCII를 의미하지 않을 때 "ASCII 코드"라고 말합니다. 그들은 그 당시에 유효한 매핑이 무엇이든 캐릭터의 숫자 값을 원합니다. 그 설명이 당신에게 적용됩니까?

그렇다면 사용할 수 있습니다 Ord 표준 함수 당신이 가진 유니 코드 문자의 유니 코드 코드 포인트 값을 얻습니다.

var
  wc: WideChar;
  ws: WideString;
  x: Word;

x := Ord(wc);
x := Ord(ws[1]);

그래도 ASCII를 실제로 의미한다면, 어떤 종류의 변환을 염두에 두어야하는지 더 구체적으로해야합니다.

예를 들어, 문자 A는 유니 코드로 U+0041로, ANSI로 41로 표시됩니다. 따라서 변환하는 것은 매우 간단하지만 유니 코드 문자가 어떻게 인코딩되는지 알아 내야합니다. 가장 일반적인 것은 UTF-16과 UTF-8입니다. UTF 16은 기본적으로 문자 당 두 바이트이지만 캐릭터가 더 많은 바이트를 가질 수 있으므로 지나치게 단순화됩니다. UTF-8은 문자 당 1 바이트를 의미하지만 2 또는 3 일 수있는 것처럼 들립니다. 문제를 더욱 복잡하게하기 위해 UTF-16은 Endian 또는 Big Endian이 될 수 있습니다. (U+0041 또는 U+4100).

예를 들어 아랍어 문자 Ain U+0639를 영어 로케일의 ANSI로 변환하고 싶을 때의 질문이 의미가없는 경우입니다. 당신은 할 수 없습니다.

유니 코드에서 ASCII로 변환하는 것에 대한 관련 질문을 참조하십시오.

일반적으로 수백만 개의 항목의 문자 세트는 정보 손실이나 인코딩 체계없이 127 개의 항목 세트로 변환 할 수 없습니다.

기능을 사용할 수 있습니다 http://swissdelphicenter.ch/en/showcode.php?id=1692
지정된 코드 페이지를 사용하여 유니 코드 문자열을 ANSI 문자열로 변환합니다.
기본 시스템 코딩을 사용하여 변환하려면 (지역 옵션에서 비 유니 코드 코드로 정의 됨) 다음과 같이 할 수 있습니다.

var
  ws: widestring;
  s: string;
begin
  s:=string(ws)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top