одновременная работа со строками в разных кодировках
От: ma3ai  
Дата: 11.04.03 14:46
Оценка:
ситуация такая:

на входе имеем unicode строки в РАЗНЫХ кодировках (англ., русский, немецкий итд.)
загоняю их в VB строку используя WinAPI WideCharToMultiByte
в итоге получается какая-то ерунда с символами по умолчанию, а-ля “?????”
(пробовал и “родную” для VB StrConv – результат тот-же)

по идее WideCharToMultiByte ДОЛЖНА конвертировать в соответствии с ПЕРЕДАВАЕМОЙ как параметр codepage, а получается что правильно всё работает если кодировка исходной строки СОВПАДАЕТ с установленной в системе (ACP, OEMCP & Co.)

Сначала подумал что грешит обработка строк в VB – где-то внутри что-то автоматом преобразовывается в установленную codepage. Неа, в массив загоняется та же ерунда.

короче лажа полная и убивает наповал ( Может кто-то знает где грабли ? Огромное пре-спасибо заранее.

ЗЫ WIN2K
ЗЫЫ поиском нашёл просто МОРЕ всякой информации связанную с unicode но нигде не описана работа с разными кодировками одновременно

На всякий случай код:
Private Const ERROR_INSUFFICIENT_BUFFER As Long = 122
Private Const ERROR_INVALID_FLAGS As Long = 1004&
Private Const ERROR_INVALID_PARAMETER As Long = 87

Public Enum Codepage
'пропушено – ....
End Enum

Private Enum WMFlags
    WC_COMPOSITECHECK = &H200
    WC_DISCARDNS = &H10
    WC_SEPCHARS = &H20
    WC_DEFAULTCHAR = &H40
End Enum

Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal Codepage As Codepage, ByVal Flags As WMFlags, ByVal WideChar As String, ByVal WideCharCount As Long, ByVal Multibyte As String, ByVal MultiByteCount As Long, ByVal DefaultChar As String, ByVal DefaultCharUsed As Long) As Long

Public Function Multibyte(ByRef Codepage As Codepage, ByRef Value As String) As String
    Dim Response As Long
    Dim DefaultCharUsed As Boolean
    Dim Flags As Long
    Response = WideCharToMultiByte(Codepage, 0, Value, -1, Multibyte, 0, 0, 0)
    If Response = 0 Then
        Select Case Err.LastDllError
            Case Is = ERROR_INSUFFICIENT_BUFFER
                Err.Raise 5000, , "Multibyte:" & "Insufficient buffer."
            Case Is = ERROR_INVALID_FLAGS
                Err.Raise 5000, , "Multibyte:" & "Not valid flags."
            Case Is = ERROR_INVALID_PARAMETER
                Err.Raise 5000, , "Multibyte:" & "Not valid parameter."
        End Select
    End If
    Multibyte = String$(Response, 0)
    Flags = WC_SEPCHARS
    Response = WideCharToMultiByte(Codepage, 0, Value, -1, Multibyte, Response, "?", DefaultCharUsed)
End Function
...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.