2017-02-09 12 views
0

현재 Excel에서 VBA로 utf-16 인코딩 된 XML 파일을 열려고합니다. EntireFile 제목Excel VBA : Open UTF-16 XML

나의 현재 String 변수는 현재 다음과 같이 시작 :

ÿþ<?xml version="1.0" encoding="utf-16"?> 
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

오프 것 처음에 일부 문자가 볼 수 있듯이.

나는 수행하여 문자열 변수를 얻을 :

Open PathToFile For Input As #1 
    Do Until EOF(1) 
       Line Input #1, textline 
       EntireFile = EntireFile & textline 

파일은 메모장에 따라 UCS-2 리틀 엔디안으로 포맷 ++하지만 빠른 검색은 인터넷이 UTF-16은 Microsoft 동등한 것으로 밝혀 트로프?

처음 두 문자를 제거하는 bruteforce 메서드를 시도했지만 빈 문자열로 남겨 둡니다.

모든 Google 검색 결과는 BOM없이 XML 파일을 저장하지만 내가 찾고있는 것과는 정반대입니다.

감사 이미 시간

답변

1

에 대한 당신은 인코딩을 변환 할 수는 Win32 API 함수를 사용할 수 있습니다.

Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (_ 
         ByVal CodePage As Long, _ 
         ByVal dwFlags As Long, _ 
         ByVal lpWideCharStr As Long, _ 
         ByVal cchWideChar As Long, _ 
         ByVal lpMultiByteStr As Long, _ 
         ByVal cbMultiByte As Long, _ 
         ByVal lpDefaultChar As Long, _ 
         ByVal lpUsedDefaultChar As Long) As Long 

Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (_ 
         ByVal CodePage As Long, _ 
         ByVal dwFlags As Long, _ 
         ByVal lpMultiByteStr As Long, _ 
         ByVal cbMultiByte As Long, _ 
         ByVal lpWideCharStr As Long, _ 
         ByVal cchWideChar As Long) As Long 

Private Const CP_UTF16 As Long = 1200& 

Private Function ConvertToUTF16(ByRef Source As String) As Byte() 

    Dim Length As Long 
    Dim Pointer As Long 
    Dim Size As Long 
    Dim Buffer() As Byte 

    Length = Len(Source) 
    Pointer = StrPtr(Source) 
    Size = WideCharToMultiByte(CP_UTF16, 0, Pointer, Length, 0, 0, 0, 0) 
    ReDim Buffer(0 To Size - 1) 

    WideCharToMultiByte CP_UTF16, 0, Pointer, Length, VarPtr(Buffer(0)), _ 
     Size, 0, 0 

    ConvertToUTF16 = Buffer 

End Function 

Private Function ConvertFromUTF16(ByRef Source() As Byte) As String 

    Dim Size As Long 
    Dim Pointer As Long 
    Dim Length As Long 
    Dim Buffer As String 

    Size = UBound(Source) - LBound(Source) + 1 
    Pointer = VarPtr(Source(LBound(Source))) 
    Length = MultiByteToWideChar(CP_UTF16, 0, Pointer, Size, 0, 0) 
    Buffer = Space$(Length) 
    MultiByteToWideChar CP_UTF16, 0, Pointer, Size, StrPtr(Buffer), Length 
    ConvertFromUTF16 = Buffer 

End Function 

Private Const CP_UTF16 As Long = 1200&은 UTF-16이다 andian 작은 코드 페이지 1,200 의미한다.

당신은 여기에 모든 코드 페이지의 목록 응답에 대한 https://msdn.microsoft.com/de-de/library/windows/desktop/dd317756(v=vs.85).aspx

+0

감사를 볼 수 있습니다. 나는 당신의 코드 블록을 모듈로 추가하고 그 코드가 채워진 후 EntireFile로 내 코드 내부에서 CovertToUTF16 (공개했다) 함수를 호출하려고 시도했다. WideCharToMultiByte는 나에게 인덱스를 벗어난다. 나는 이것이 내포 된 함수이기 때문에 내 마지막에 오류가 있다고 확신하지만 어디에서 단서가 없다. – celphy

+0

나는 전체 코드를 다시 살펴 봤는데 Len (Source)이 3000을 반환하지 않으면 가져온 함수가 의도 한대로 올바르게 수행된다는 것을 알았습니다 (분명히 잘못되었습니다). – celphy