Здравствуйте, ma3ai, Вы писали:
M>ситуация такая:
M>на входе имеем unicode строки в РАЗНЫХ кодировках (англ., русский, немецкий итд.)
M>загоняю их в VB строку используя WinAPI WideCharToMultiByte
M>в итоге получается какая-то ерунда с символами по умолчанию, а-ля “?????”
M>(пробовал и “родную” для VB StrConv – результат тот-же)
M>по идее WideCharToMultiByte ДОЛЖНА конвертировать в соответствии с ПЕРЕДАВАЕМОЙ как параметр codepage, а получается что правильно всё работает если кодировка исходной строки СОВПАДАЕТ с установленной в системе (ACP, OEMCP & Co.)
M>Сначала подумал что грешит обработка строк в VB – где-то внутри что-то автоматом преобразовывается в установленную codepage. Неа, в массив загоняется та же ерунда.
M>короче лажа полная и убивает наповал
( Может кто-то знает где грабли ? Огромное пре-спасибо заранее.
M>ЗЫ WIN2K
M>ЗЫЫ поиском нашёл просто МОРЕ всякой информации связанную с unicode но нигде не описана работа с разными кодировками одновременно
M>На всякий случай код:
M>M>Private Const ERROR_INSUFFICIENT_BUFFER As Long = 122
M>Private Const ERROR_INVALID_FLAGS As Long = 1004&
M>Private Const ERROR_INVALID_PARAMETER As Long = 87
M>Public Enum Codepage
M>'пропушено – ....
M>End Enum
M>Private Enum WMFlags
M> WC_COMPOSITECHECK = &H200
M> WC_DISCARDNS = &H10
M> WC_SEPCHARS = &H20
M> WC_DEFAULTCHAR = &H40
M>End Enum
M>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
M>Public Function Multibyte(ByRef Codepage As Codepage, ByRef Value As String) As String
M> Dim Response As Long
M> Dim DefaultCharUsed As Boolean
M> Dim Flags As Long
M> Response = WideCharToMultiByte(Codepage, 0, Value, -1, Multibyte, 0, 0, 0)
M> If Response = 0 Then
M> Select Case Err.LastDllError
M> Case Is = ERROR_INSUFFICIENT_BUFFER
M> Err.Raise 5000, , "Multibyte:" & "Insufficient buffer."
M> Case Is = ERROR_INVALID_FLAGS
M> Err.Raise 5000, , "Multibyte:" & "Not valid flags."
M> Case Is = ERROR_INVALID_PARAMETER
M> Err.Raise 5000, , "Multibyte:" & "Not valid parameter."
M> End Select
M> End If
M> Multibyte = String$(Response, 0)
M> Flags = WC_SEPCHARS
M> Response = WideCharToMultiByte(Codepage, 0, Value, -1, Multibyte, Response, "?", DefaultCharUsed)
M>End Function
M>
Вот этот код работает железно с русским, английским

, ивритом, французским и немецким.
с плюсиков на вб портируешь и все.
#include "stdafx.h"
CString ConvertToAnsi(int CP, const WCHAR * szW)
{
unsigned int n = wcslen(szW);
char * achA = new char[n + 1];;
WideCharToMultiByte(CP, 0, szW, -1, achA, n, NULL, NULL);
achA[n] = 0;
CString ret(achA);
delete [] achA;
return ret;
}
CString ConvertToOEM(int CP, const char * szA)
{
unsigned int n = strlen(szA);
WCHAR * achW = new WCHAR[n + 1];
MultiByteToWideChar(CP, 0, szA, -1, achW, n);
achW[n] = 0;
CString ret((LPCSTR)achW, (n+1)*2);
delete [] achW;
return ret;
}
CString ConvertToHtmlUnicode(const WCHAR * str)
{
WCHAR * w = (WCHAR *)str;
CString ret;
while(*w != 0)
{
ret.Format("&#%d;", *w);
w++;
}
return ret;
}
CString ConvertToHtmlUnicode(int CP, const char * str)
{
CString wstr = ConvertToOEM(CP, str);
WCHAR * w = (WCHAR *)(LPCSTR)wstr;
CString ret;
while(*w != 0)
{
CString s;
s.Format("&#%d;", *w);
ret += s;
w++;
}
return ret;
}