одновременная работа со строками в разных кодировках
От: 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
...
Re: одновременная работа со строками в разных кодировках
От: LantY Россия icq:56949749
Дата: 13.04.03 07:23
Оценка:
Здравствуйте, ma3ai, Вы писали:

M>на входе имеем unicode строки в РАЗНЫХ кодировках (англ., русский, немецкий итд.)


А что ты хочешь получить на выходе???
Если просто вывести unicode строку, то попробуй загонять БЕЗ какой-либо конвертации. Строки в VB итак unicode.

M>загоняю их в VB строку используя WinAPI WideCharToMultiByte

M>в итоге получается какая-то ерунда с символами по умолчанию, а-ля “?????”
M>(пробовал и “родную” для VB StrConv – результат тот-же)

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

Не совсем так.
CodePage
[in] Specifies the code page used to perform the conversion. This parameter can be given the value of any code page that is installed or available in the system.
Например, у меня в системе французкой и греческой кодировкой даже не пахнет — конвертация в эти кодировки не проходит.
С уважением, Дмитрий.
Re[2]: одновременная работа со строками в разных кодировках
От: ma3ai  
Дата: 14.04.03 08:59
Оценка:
Здравствуйте, LantY, Вы писали:

LY>А что ты хочешь получить на выходе???

1. к примеру показ/поиск/другая обработка списков сообщений написанных посетителями на разных языках (кодировках)
2. список файлов/папок (eng, cyr)
пока хватит...

LY>... This parameter can be given the value of any code page that is installed or available in the system.

оп-па, это я пропустил вообще-то наверное правильно — как-бы не должно работать то, что ещё не установлено

Всёравно это не спасает. У меня установлены все необходимые языки в Win2K->Regional Optionz
и если текущая кодировку (set default...) установить cyr, то после конвертации коверкается текст по немецки. если eng — нечитаемо cyr и.т.д.

Но ведь explorer в Win2K-XP понимает-же как-то все названия в фолдерах — в одной папке одновременно могут быть файлы/папки с любыми названиями независимо от активной codepage Что наводит на размышления о нечестных приёмах.
хАчу как ту-у-у-т
...
Re[3]: одновременная работа со строками в разных кодировках
От: LantY Россия icq:56949749
Дата: 17.04.03 13:17
Оценка:
Здравствуйте, ma3ai, Вы писали:

M>Здравствуйте, LantY, Вы писали:


LY>А что ты хочешь получить на выходе???

M>1. к примеру показ/поиск/другая обработка списков сообщений написанных посетителями на разных языках (кодировках)
M>2. список файлов/папок (eng, cyr)
M>пока хватит...

Я провел следующий эксперимент:

Dim a As String
Dim b As String
Dim fff As New FileSystemObject
Dim f As Files
Dim ph As Folder
Dim q As File

Private Sub Form_Load()
  Set ph = fff.GetFolder("C:\LantY\New Folder") 'папка с файлами как на твоем рисунке...
  Set f = ph.Files
  For Each q In f
    ListBox1.AddItem q.Name
  Next q
  a = "-=ßaßßßasüqß++üá´d´z" 'Текст в немецкой кодировке.
  b = "âê^qûî$fbv$"         'Текст в французской кодировке.
  TextBox1.Text = a
  TextBox2.Text = b
End Sub

Private Sub TextBox1_Change()
  a = TextBox1.Text
  TextBox2.Text = a
End Sub


Получил: а) Начальные значения переменных a и b выводятся не корректно (подозреваю, что это проблема редактора)
б) В textbox1 пишу текст в любой из 4-х кодировок (en, ru, de , fr) (можно смешивать). В обеих textbox он отображается коректно. (я даже копировал из Explorer название файла на французском языке — тоже все ОК).
ОДНО НО!!! Пришлось использовать не стандартные VB компоненты, а библиотеку MS Forms 2.0

Я уже писал в предыдущем сообщении: попробуй работать со входными строками AS IS. И забуть про конвертацию.
С уважением, Дмитрий.
Re[4]: одновременная работа со строками в разных кодировках
От: ma3ai  
Дата: 22.04.03 15:36
Оценка:
Здравствуйте, LantY, Вы писали:

Спасибо за участие в моём вопросе.

LY>... (подозреваю, что это проблема редактора)

точно
LY>ОДНО НО!!! Пришлось использовать не стандартные VB компоненты, а библиотеку MS Forms 2.0
то же самое
LY>Я уже писал в предыдущем сообщении: попробуй работать со входными строками AS IS. И забуть про конвертацию.
И да и нет. Не всё так просто если используется какой-нибудь API (из-за чего собс-но всё заварилось) Всё зависит от того, как енту строку подставить.
В моём случае это было так (очень коротко для простоты):
FindNextFileW(ID,FileInfo)
Теперь в FileInfo.cFileName Unicode строка но записанная в ANSI секцию VB строки (см. ниже)
т.е. строка “ABC” (побайтно — 41 00 42 00 43 00) записывается как (41 00 00 00 42 00 00 00 43 00 00 00) Вот и видим что-то типа этого
Ну и как тут не задумаешся о том что это безобразие надо-бы конвертнуть куда-нибудь с глаз долой ?

В общем, в конечном счёте обнаружилось множество интересных нюансов (где-то можно сказать — багов) в работе и взаимодействии некоторых почтенных приложений.
Т.е. где-то поддержку Unicode “вгрызли” на последних минутах разработки, где-то сказались привычки “зубров” писать только C_строки. Бурелом какой-то.

Самое главное, о чём я до этого не подозревал это то, что VB фактически хранит 2 (!) строки в разных местах:
1 — Однобайтовая (ANSI) строка. Для передачи в API типа FuncA
2 — Двухбайтовая (Unicode) строка для себя или для API ф-ий типа FuncW.
Проверить можно кодом ниже. Это ж какая расточительность, блин – на каждый символ 3 байта.

А вообще для работы с API+Unicode+VB теперь использую массивы – нету многих заморочек и местами быстрей до 30% Такой вот расклад. Если интересно – пишите письма.

Public Sub TestStrings()
    Dim str As String
    Const Bytes As Long = 16
    str = "AC-ïðî"
    Debug.Print String(Bytes * 3 + 18, "=")
    Debug.Print "ANSI    " & DumpANSI(str, Bytes)
    Debug.Print "Unicode " & DumpUnicode(str, Bytes)
End Sub

Private Function DumpANSI(ByRef str As String, ByRef Bytes As Long) As String
    Dim addr As Long
    CopyMemory addr, str, 4
    DumpANSI = HexDump(addr, Bytes)
End Function

Private Function DumpUnicode(ByRef str As String, ByRef Bytes As Long) As String
    DumpUnicode = HexDump(StrPtr(str), Bytes)
End Function

Private Function HexDump(ByRef addr As Long, ByRef Bytes As Long) As String
    Dim arr() As Byte
    Dim Iterator As Long
    If addr = 0 Then
        Err.Raise 5000, , "Not valid address."
    End If
    ReDim arr(Bytes - 1)
    CopyMemory arr(0), ByVal addr, Bytes
    For Iterator = 0 To (Bytes - 1)
        HexDump = HexDump & Right$("0" & Hex(arr(Iterator)), 2) & " "
    Next
    HexDump = "0x" & Right$("00000000" & Hex(addr), 8) & " " & HexDump
End Function
...
Re[5]: Способы передачи строк
От: Vi2 Удмуртия http://www.adem.ru
Дата: 23.04.03 06:36
Оценка:
Здравствуйте, ma3ai, Вы писали:

M>Самое главное, о чём я до этого не подозревал это то, что VB фактически хранит 2 (!) строки в разных местах:
M>1 — Однобайтовая (ANSI) строка. Для передачи в API типа FuncA
M>2 — Двухбайтовая (Unicode) строка для себя или для API ф-ий типа FuncW.
M>Проверить можно кодом ниже. Это ж какая расточительность, блин – на каждый символ 3 байта.

На самом деле ты проверил не хранение, а способы передачи строки в подпрограммы. Да, есть 2 способа. Но как хранит строки сам VB — это загадка. Скорее всего в Варианте с VT_BSTR, VT_LPSTR или VT_LPWSTR.

Поэтому, если тебе нужно передавать char*, то описывай параметр как ByVal s As String и передавай s.
Если тебе нужно передавать wchar_t*, то описывай параметр как ByVal s As Any и передавай StrPtr(s).

Private Declare Sub TestVarAnsi Lib "moddll" Alias "_TestVarAnsi@4" (ByVal pDoc As String)
Private Declare Sub TestVarUni Lib "moddll" Alias "_TestVarUni@4" (ByVal pDoc As Any)

Private Sub Form_Load()
  Dim s As String
  s = "abc"
  
  Call TestVarAnsi(s)
  Call TestVarUni(StrPtr(s))
  
  Unload Me
End Sub


__declspec(dllexport) void __stdcall TestVarAnsi(/*[in,out]*/ LPSTR pStatus )
{
    pStatus[1] = 'A';
    return;
}

__declspec(dllexport) void __stdcall TestVarUni(/*[in,out]*/ LPWSTR pStatus)
{
    pStatus[1] = 'B';
    return;
}

Учитывая, что память под строку не может быть изменена в этих функциях, т.е. размер должен быть достаточным.

PS
Работа со строками отличается от других типов особенно в массивах s() As String и i() As Long. i(0) можно передавать в функции как long* и получать доступ ко всем элементам массива. Со строками это не проходит по указанной выше причине — VB манипулирует с ними дополнительно, хотя известно что строки хранятся в массиве как указатели на BSTR.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: Способы передачи строк
От: ma3ai  
Дата: 23.04.03 07:39
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>На самом деле ты проверил не хранение, а способы передачи строки в подпрограммы

на самом деле одно (передача) является следствием другого (хранение)

И как ещё по другому объяснить разные адреса ?
=================================================================================================
ByVal str         0x001E8384 41 42 43 00 00 00 31 00 38 00 34 00 00 00 00 00  |ABC   1 8 4      |
ByVal strptr(str) 0x001E7E74 41 00 42 00 43 00 00 00 6C 00 00 00 09 00 00 00  |A B C   l        |


в конце концов можно написать TestVarUni(str) и получить кашу типа ??? А можно ... /возможное обсуждение способов передачи параметров пропущено/

Vi2>Работа со строками отличается от других типов особенно в массивах ...

А это уже заморочки с SAFEARRAY при приёме [интересно, будет когда нибудь значок "стало плохо" ? ]

ЗЫ извиняюсь, но в предыдущем посте я пропустил
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
...
Re: одновременная работа со строками в разных кодировках
От: Akzhan Россия http://www.akzhan.midi.ru/devcorner/
Дата: 02.05.03 13:10
Оценка:
Здравствуйте, ma3ai, Вы писали:

M>ситуация такая:


M>на входе имеем unicode строки в РАЗНЫХ кодировках (англ., русский, немецкий итд.)

M>загоняю их в VB строку используя WinAPI WideCharToMultiByte
M>в итоге получается какая-то ерунда с символами по умолчанию, а-ля “?????”
M>(пробовал и “родную” для VB StrConv – результат тот-же)

В таких случаях надо делать наоборот. Все строки конвертировать в Unicode,
и выполнять сравнение, поиск и замену именно в этой кодировке.

Строки в VB.NET, по крайней мере, чистый Unicode. А для работы с кодировками есть класс System.Text.Encoding.
С уважением,
Акжан, http://www.akzhan.midi.ru/devcorner/ — мой уголок разработчика
Re: одновременная работа со строками в разных кодировках
От: BugMan  
Дата: 12.06.03 19:40
Оценка:
А кто знает как читать строки из Unicode файла (на VB ессно)?
Как собственно привести строку полученную из файла в Input или Binary mode привести в читаемый вид?

Читаю так:

    hFile = FreeFile
    Open sPath For Input As #hFile
        sText = Input(2, #hFile)
        If isUnicode(sText) Then
            sText = Input(LOF(hFile) / 2 - 1, #hFile)
        Else
            sText = sText & Input(LOF(hFile) - 2, #hFile)
        End If
    Close hFile


Private Function isUnicode(sText As String) As Boolean
    If Asc(sText) = 255 And Asc(Mid(sText, 2, 1)) = 254 Then
        isUnicode = True
    End If
End Function


Есть какие-нибудь идеи?
Re[2]: одновременная работа со строками в разных кодировках
От: ma3ai  
Дата: 13.06.03 08:05
Оценка: 9 (1)
Здравствуйте, BugMan, Вы писали:

можно читать в байтовый массив и загонять его в стринг
примерно так

Public Function Contents(ByRef FileName As String) As String
    Dim FileID As Long
    Dim cont() As Byte
    FileID = FreeFile()
    Open FileName For Binary As FileID
    ReDim cont(LOF(FileID))
    Get FileID, , cont()
    Contents = cont()
    Close FileID
End Function
...
Re: одновременная работа со строками в разных кодировках
От: lom2k  
Дата: 13.06.03 08:24
Оценка:
Здравствуйте, 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;

}
Re[2]: одновременная работа со строками в разных кодировках
От: ma3ai  
Дата: 13.06.03 08:52
Оценка:
Здравствуйте, lom2k, Вы писали:

насчёт английского это да — самое сложное
ну а вообще проблему решил. (фишка в том как правильно передать unicode содержимое вб строки в/из c-dll)

WideCharToMultiByte хоть и полезная штука но нужна для других целей.

В любом случае, спасибо. Всё что ни делается — к лучшему.
...
Re[3]: одновременная работа со строками в разных кодировках
От: BugMan  
Дата: 13.06.03 15:41
Оценка:
Здравствуйте, ma3ai, Вы писали:

M>Здравствуйте, BugMan, Вы писали:


M>можно читать в байтовый массив и загонять его в стринг

M>примерно так
M>[vb]
Ха! А я ведь так и подумал сразу, что надо открывать в Binary mode, только не допер как в массив считать
Вобщем сенкс.
Re[3]: одновременная работа со строками в разных кодировках
От: BugMan  
Дата: 13.06.03 16:01
Оценка:
Здравствуйте, ma3ai, Вы писали:

M>Public Function Contents(ByRef FileName As String) As String

M> Dim FileID As Long
M> Dim cont() As Byte
M> FileID = FreeFile()
M> Open FileName For Binary As FileID
M> ReDim cont(LOF(FileID))
M> Get FileID, , cont()
M> Contents = cont()
M> Close FileID
M>End Function
M>[/vb]
Секундочку. Чего то я не въехал в суть данного процесса. Т.е. содержимое пихается в Byte Array, но Unicode символы то больше чем Byte, так чтож это получается что содержимое конвертится в ASCII? А если там китайские иероглифы то это работать не будет?

Поясню что я пытаюсь сделать. Я написал пару классов для работы с ini файлами, и теперь помимо прямого назначения хочу использовать их для хранения текстовых ресурсов. Реально ли это для языков не помешающихся в ASCII?
Re[4]: одновременная работа со строками в разных кодировках
От: BugMan  
Дата: 13.06.03 16:09
Оценка:
Я вобщем то понял что массив что массив должен быть в два раза больше самой строки, но по какому принципу выполняется конвериация Array->String не ясно. Для русского — работает, а вот что с азиатскими языками будет......
Re[5]: одновременная работа со строками в разных кодировках
От: ma3ai  
Дата: 16.06.03 08:17
Оценка:
Здравствуйте, BugMan, Вы писали:

BM>Я вобщем то понял что массив что массив должен быть в два раза больше самой строки, но по какому принципу выполняется конвериация Array->String не ясно.


Думаю, просто копируется побайтно (хм, или побайтово ? )

Если мучают сомнения Contents = cont() можно переделать так:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Count As Long)

    '**** Contents = cont()
    Dim Count As Long
    Count = UBound(cont()) - LBound(cont()) + 1
    If Count > 0 Then
        Contents = Space(Count / 2)
        CopyMemory ByVal StrPtr(Contents), cont(0), Count
    End If
    '***



BM>Для русского — работает, а вот что с азиатскими языками будет......


а проверить ?
...
Re[4]: одновременная работа со строками в разных кодировках
От: ma3ai  
Дата: 16.06.03 08:22
Оценка:
Здравствуйте, BugMan, Вы писали:

BM>Реально ли это для языков не помешающихся в ASCII?


Unicode ? Да.
...
Re[6]: одновременная работа со строками в разных кодировках
От: BugMan  
Дата: 16.06.03 14:26
Оценка:
Здравствуйте, ma3ai, Вы писали:

M>Здравствуйте, BugMan, Вы писали:


BM>>Я вобщем то понял что массив что массив должен быть в два раза больше самой строки, но по какому принципу выполняется конвериация Array->String не ясно.


M>Думаю, просто копируется побайтно (хм, или побайтово ? )


M>Если мучают сомнения Contents = cont() можно переделать так:

Каша получается. Т.е. писать туже строку что считал, то всё пучком, а вот если
 sStr = sStr & "xxx"

, где sStr, прочитанная строка, то записывается какая то ахинея, как будто перед копированием в Array вся строка ЕЩЕ раз преобразуется в Unicode.


M>
M>Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Count As Long)

M>    '**** Contents = cont()
M>    Dim Count As Long
M>    Count = UBound(cont()) - LBound(cont()) + 1
M>    If Count > 0 Then
M>        Contents = Space(Count / 2)
M>        CopyMemory ByVal StrPtr(Contents), cont(0), Count
M>    End If
M>    '***
M>

Сначала так и пробовал, еще когда с чтением мучался.

BM>>Для русского — работает, а вот что с азиатскими языками будет......

M>а проверить ?
Ну это нада азиата гдето взять, а щас пока нету
Re[6]: одновременная работа со строками в разных кодировках
От: BugMan  
Дата: 16.06.03 17:54
Оценка:
Млин! забыл сказать что с считыванием все ok. Предыдущий пост каксается записи
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.