2011-03-31 46 views
3

我有以下Visual Basic 6.0函數,它通過FTP將ANSI字符串寫入新文件。我希望它將文件編寫爲UTF-16LE。在以下方法中有沒有什麼好的方法可以做到這一點?通過FTP將ANSI字符串寫入Unicode文件

Public Sub writeToFile(ByVal FTPServer As String _ 
       , ByVal userName As String _ 
       , ByVal password As String _ 
       , ByVal contents As String _ 
       , ByVal destinationFile As String) 

    Dim hFile As Long 
    Dim lCount As Long 

    inetOpen 
    inetConnect FTPServer, userName, password 
    hFile = apiFtpOpenFile(m_hFTP, destinationFile, GENERIC_WRITE, FTP_TRANSFER_TYPE_BINARY, 0&) 
    If hFile = 0 Then 
     Err.Raise EWMFTPErrorCodes.wmFTPSendError, , internetError 
    End If 

    If apiInternetWriteFile(hFile, contents, Len(contents), lCount) = 0 Then 
     Err.Raise EWMFTPErrorCodes.wmFTPSendError, , internetError 
    End If 

    apiInternetCloseHandle hFile 
End Sub 

我在10年左右沒有完成Visual Basic 6.0,所以我最好搖搖晃晃。任何投入將不勝感激。

這裏是apiInternetWriteFile聲明;

Private Declare Function apiInternetWriteFile Lib "wininet.dll" Alias "InternetWriteFile" (_ 
         ByVal hFile As Long _ 
         , ByVal lpBuffer As String _ 
         , ByVal dwNumberOfBytesToWrite As Long _ 
         , ByRef lpdwNumberOfBytesWritten As Long) As Long 

回答

2

我們需要看到apiInternetWriteFile的聲明。我很確定這是一個Declare到一個API調用中,也許在WinINet.dll something。我的猜測是,你需要:

  • 更改申報,因此預計,第二個參數
  • 編輯一個ByVal Long獲得在開始一個BOM,嘗試Contents = ChrW(&HFEFF&) & Contents。或者可能是FFEF,不確定字節序。
  • 通行證StrPtr(contents)爲第二參數
  • 通行證Len(contents)*2的第三參數(以字節爲單位的長度)

這將傳遞的Unicode UTF-16的字符串作爲內容參數

+0

衛生署,我認爲完美工作,文件大小現在翻倍。但是它沒有UTF-16LE BOM(ff fe)。有關如何解決這個問題的任何建議? – cc0 2011-03-31 10:53:41

+1

查看我的編輯,請回復,告訴我們它是否有效,我會進行相應的編輯。 – MarkJ 2011-03-31 11:26:05

+0

LE是FFFE,你的編輯確實把BOM放在那裏,但是文本變得亂七八糟。有些東西是歪斜的。我試圖將字符串轉換爲字節數組,然後與BOM字節數組連接。然後我有建議使用ADO Stream對象,這似乎更好。雖然如果你能找到一個簡單的解決方案,我很樂意看到它。 – cc0 2011-03-31 12:00:01