2016-10-04 6 views
4

Resource Hacker에서 내 보낸 파일이 .inf입니다. 파일은 UTF-16 LE 인코딩입니다.Inno Setup 파스칼 스크립트 - UTF-16 파일 읽기

EXTRALARGELEGENDSII_INI TEXTFILE "Data.bin" 

LARGEFONTSLEGENDSII_INI TEXTFILE "Data_2.bin" 

NORMALLEGENDSII_INI TEXTFILE "Data_3.bin" 

THEMES_INI TEXTFILE "Data_4.bin" 

나는 LoadStringFromFile function 사용하여로드 할 때 :

procedure LoadResources; 
var 
    RESOURCE_INFO: AnsiString; 
begin 
    LoadStringFromFile(ExpandConstant('{tmp}\SKINRESOURCE - INFO.inf'), RESOURCE_INFO); 
    Log(String(RESOURCE_INFO)); 
end; 

나는 디버그 출력이 무엇입니까 :

E 

방법이 문제를 해결하는 방법을 가르쳐주세요.

미리 감사드립니다.

답변

0

로그하려는 파일이 Windows 유니 코드 (UTF-16LE) 인코딩 된 텍스트 파일 인 것 같습니다.

iConv 명령 줄을 사용하여 파일을 Windows UTF-8 인코딩 파일로 변환 할 수 있습니다.

LoadStringFromFile Support Function은 유니 코드 문자열을 제대로로드하지 않으며 ANSI 및 UTF-8 인코딩 된 텍스트 파일로드 만 지원합니다.

Inno Setup 컴파일러 디버그 출력은로드 할 수없는 문자 (NULL)를 찾기 때문에 텍스트 파일 로깅을 중지하므로 컴파일러 디버그 출력에서 ​​"E"만 가져 오는 이유는 LoadStringFromFile도 텍스트 파일을 완전히로드하기 때문입니다. 의 iconv 실행 파일을 얻기 위해 다음과 같이 몇 가지 DLL을 문자 인코딩 사이의 변환에 사용 된


당신은의 iconv의 설치 프로그램을 다운로드해야합니다.

다운로드 후

enter image description here

, GnuWin32 (Windows 용 LibIconv)를 설치하고 설치 폴더로 이동합니다.

"bin"이라는 설치 폴더의 하위 디렉토리에있는 다음 네 개의 파일을 복사하십시오.

그들은 다음과 같습니다

libcharset1.dll

libiconv2.당신이 당신의 이노 설치 프로젝트의 파일을 저장할 디렉토리에이 파일을 복사

iconv.exe

libintl3.dll dll을.

그런 다음 변환을 수행하려면 다음 코드를 사용하십시오.

[Files] 
Source: "libcharset1.dll"; Flags: dontcopy 
Source: "iconv.exe"; Flags: dontcopy 
Source: "libiconv2.dll"; Flags: dontcopy 
Source: "libintl3.dll"; Flags: dontcopy 

[Code] 
function InitializeSetup(): Boolean 
var 
    ErrorCode: Integer; 
begin 
    ExtractTemporaryFile('iconv.exe'); 
    ExtractTemporaryFile('libcharset1.dll'); 
    ExtractTemporaryFile('libintl3.dll'); 
    ExtractTemporaryFile('libiconv2.dll'); 
    ShellExec('Open', ExpandConstant('CMD.exe'), ExpandConstant('/C iConv -f UTF-16LE -t UTF-8 < SKINRESOURCE-INFO.inf > SKINRESOURCE-INFO-ANSI.inf'), ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ErrorCode); 
    DeleteFile(ExpandConstant('{tmp}\SKINRESOURCE-INFO.inf')); 

지금 LoadStringFromFile는 윈도우 UTF-8 인코딩이 제대로 지금처럼 텍스트 파일을로드해야합니다.

유니 코드 Inno Setup을 사용하는 경우 Log(String(RESOURCE_INFO))과 같은 유니 코드 문자열로 변환 한 후 로그 할 수도 있습니다.

+0

감사합니다! 매력처럼 작동합니다! – Blueeyes789

+0

1) 왜 ANSI인가? 이런 식으로 유니 코드 문자를 잃게됩니다. UTF-8을 사용하십시오! 2) ANSI는 Windows-1252와 같지 않습니다. ANSI 인코딩은 Windows 구성에 따라 다릅니다. 따라서 명시 적으로 Windows-1252로 변환했지만 구성된 ANSI 인코딩을 사용하여 파일을로드하면 파일에서 ASCII 문자 만 사용하지 않는 한 엉망이됩니다. 3) [PowerShell을 사용하여 인코딩 변환] (http://stackoverflow.com/a/4817683/850848), 타사 도구가 필요하지 않습니다. 그러나 어쨌든 외부 도구가 필요하지 않습니다. 이것을 파스칼 스크립트로 변환 할 수 있습니다. –

+0

@MartinPrikryl이 UTF-8로 수정되었습니다. PowerShell을 잊어 버렸습니다. :-( – GTAVLover

3

파일이 UTF-16 LE 인코딩 형식입니다.

LoadStringFromFile은 유니 코드 인코딩을 지원하지 않습니다. 파일을있는 그대로 바이트 배열에로드합니다 (AnsiString은 바이트 배열로 효과적으로 사용됩니다).

유니 코드 string은 실제로 UTF-16 LE 인코딩을 사용하기 때문에 비트 배열을 (유니 코드) string에 비트별로 복사해야합니다. UTF-16 LE BOM (FEFF)을 잘라냅니다.

procedure RtlMoveMemory(Dest: string; Source: PAnsiChar; Len: Integer); 
    external '[email protected] stdcall'; 

function LoadStringFromUTF16LEFile(FileName: string; var S: string): Boolean; 
var 
    A: AnsiString; 
begin 
    Result := LoadStringFromFile(FileName, A); 
    if Result then 
    begin 
    SetLength(S, Length(A) div 2); 
    RtlMoveMemory(S, A, Length(S) * 2); 
    { Trim BOM, if any } 
    if (Length(S) >= 1) and (Ord(S[1]) = $FEFF) then 
     Delete(S, 1, 1); 
    end; 
end; 

도 참조 Inno Setup Reading file in Ansi and Unicode encoding합니다.

+0

무엇을 원하십니까? 나는이 변환이 불가능하다고 생각한다. 답변 주셔서 감사합니다, 어떤 기능이 유니 코드 인코딩을 지원하는지 알고 싶습니다. :-) – Blueeyes789

+0

죄송합니다. 나는 여기에 도움을 요청했다. 이전 메모를 무시하십시오. :-( – GTAVLover

+0

[Inno와 Unicode 인코딩의 Inno 설정 읽기 파일보기] (http://stackoverflow.com/q/38968230/850848) –