2017-02-09 2 views
0

現在ExcelでVBAを使用してutf-16でエンコードされたXMLファイルを開くのに苦労しています。あなたには、いくつかの文字がオフに見える初めにある見ることができるようにExcel VBA:Open UTF-16 XML

ÿþ<?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"> 

:EntireFileというタイトル

私の現在の文字列変数には、現在のように開始されます。

は、私が実行して文字列変数を取得:

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

ファイルをメモ帳によるとUCS-2リトルエンディアンでフォーマットされた++が、クイック検索は、インターネットが、これはUTF-16に、Microsoftの同等であることを明らかにしたトラフ?

私は最初の2文字を削除するだけの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 little ANDianであるコードページ1200を意味します。

あなたはここに答えるためhttps://msdn.microsoft.com/de-de/library/windows/desktop/dd317756(v=vs.85).aspx

+0

おかげで、すべてのコードページの一覧を見ることができます。私はあなたのコードブロックをモジュールとして追加し、コードが埋め込まれた後でEntireFileでコード内からCovertToUTF16(私が公開した)関数を呼び出そうとしました。 WideCharToMultiByteは私に範囲外のインデックスを与えます。私はこれがインポートされた関数なので、私の最後にエラーがあることは間違いないと確信していますが、私はどこに手がかりがありません。 – celphy

+0

私はもう一度コード全体を調べ、Len(Source)が3000を返さなかった場合(正しくは間違っている)、インポートされた関数が意図したとおりに機能することを発見しました。 – celphy