Опять Unicode...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Опять Unicode...

Сообщение Sirik » 18.03.2014 (Вт) 17:36

Добрый день
Пишу клиет-серверное приложение (клиенты Android, сервер win7 VB 6.0). Не могу побороть конвертацию на стороне сервера utf-8 в ascii. Использую функцию Артура для ковертации utf -> ascii:
Код: Выделить всё
Public Function UTF8ToWin(ByVal inString As String) As String
        Dim hMemLock1   As Long, hMemLock2  As Long
        Dim iStrSize    As Long, lMaxSize As Long, str1 As String, str2 As String
        inString = inString & vbNullChar
       
        lMaxSize = Len(inString)
        str1 = String$(lMaxSize, Chr(0))
        str2 = String$(lMaxSize, Chr(0))
        hMemLock1 = StrPtr(str1)
        hMemLock2 = StrPtr(str2)
       
        iStrSize = MultiByteToWideChar(65001, 0&, inString, -1, hMemLock1, lMaxSize)
        iStrSize = WideCharToMultiByte(0&, 0&, hMemLock1, -1, hMemLock2, iStrSize, 0&, 0&)
       
        If Len(iStrSize) Then
            UTF8ToWin = StrConv(str2, vbUnicode)
        End If
End Function


И функцию ascii -> utf-8:
Код: Выделить всё
Public Function EncodeUTF8(strSrc As String) As String
    Dim nLen As Long
    Dim strDst As String
    Dim strRet As String
    Dim nRet As Long
    Dim p As Long
   
    nLen = Len(strSrc)
    strDst = String(nLen * 2, Chr(0))
    strRet = String(nLen * 2, Chr(0))
    p = StrPtr(strDst)
    nRet = MultiByteToWideChar(0&, &H1, strSrc, nLen, p, nLen)
    nRet = WideCharToMultiByte(65001, 0, p, nRet, StrPtr(strRet), nLen * 2, ByVal 0, 0)
    EncodeUTF8 = Left$(StrConv(strRet, vbUnicode), nRet)
End Function


Локально кодировка и декодировка работает отлично. Проблемы начинаются когда клиент посылает строку в utf-8. Получается, что результирующая строка меньше на несколько символом, причем каждый раз на разное количество. Проблем нет, когда строка "приходит" только на англ. языке, но как только появляются русские символы, пропадают символы.
Я так думаю, что не совсем правильно определяется длина строки. Но как это побороть не могу понять.
Подскажите где грабли
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Опять Unicode...

Сообщение Jack Ferre » 18.03.2014 (Вт) 19:46

Локально кодировка и декодировка работает отлично.

Странно. У меня EncodeUTF8 всегда возвращает пустую строку, UTF8ToWin - рушит IDE.

Откуда вы берете ASC2 и UTF8 строки?

Если ASC2 из переменных as String, то они в USC2 (2 байта на символ), а не ASC2.
Если UTF8 из сокета в переменную as String - это плохая идея, читайте в массив байтов.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 18.03.2014 (Вт) 19:56

Из сокета в String, это точно. Остальное гляну когда буду на работе. И как правильно в массив читать?
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Опять Unicode...

Сообщение Jack Ferre » 18.03.2014 (Вт) 20:30

Если из контрола MSWinSock, то так:
Код: Выделить всё
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim baData() As Byte
    ReDim baData(bytesTotal) As Byte
    Winsock1.GetData baData
End Sub

Функциии для декодирования UTF8. Конкретно эта - Utf8ToUcs2

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 18.03.2014 (Вт) 20:53

Спасибо, чуть позже попробую
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять Unicode...

Сообщение Хакер » 19.03.2014 (Ср) 9:24

Sirik, тут всё плачевно.

Начнём с того, что брать из сокета данные в виде String-а, а не в виде массива байтов — это преступление.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 19.03.2014 (Ср) 12:42

Теперь я согласен, так как в прошлом не имел дело с unicode

Теперь по коду. Отправляю слово "ПриВЕТ". Принимаю данные в массив байт:
Код: Выделить всё
    Dim baData() As Byte
    ReDim baData(bytesTotal) As Byte
   
    w_In.GetData baData

Принятый массив: 208 159 209 128 208 184, т.е. 6 букв. пока что все правильно.

Далее декодирую функцией Хакера:
Код: Выделить всё
Public Function Utf8ToUcs2(ByRef sInputUtf8Str() As Byte) As String
    Dim ret As Long
    Dim nInpLength As Long: nInpLength = ByteArySize(sInputUtf8Str)
    If nInpLength = 0 Then Exit Function Else Utf8ToUcs2 = Space(nInpLength)
    ret = MultiByteToWideChar(CP_UTF8, 0, _
                              sInputUtf8Str(LBound(sInputUtf8Str)), nInpLength, _
                              ByVal StrPtr(Utf8ToUcs2), nInpLength)
    If ret = 0 Then Error 51 Else Utf8ToUcs2 = Left$(Utf8ToUcs2, ret)
End Function

В ответ получаю только 208 и все.
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 19.03.2014 (Ср) 13:36

Извиняюсь за невнимательность, функция MultiByteToWideChar была объявлена так:
Код: Выделить всё
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long


Тогда как в коде Хакера так:
Код: Выделить всё
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, lpMultiByteStr As Any, ByVal cchMultiByte As Long, lpWideCharStr As Any, ByVal cchWideChar As Long) As Long


Но все ровно, если ее объявить во 2 варианте, декодируются только 3 буквы.

И вообще объясните мне пожалуйста почему они объявляются разными способами?
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять Unicode...

Сообщение Хакер » 19.03.2014 (Ср) 14:06

Sirik писал(а):Теперь по коду. Отправляю слово "ПриВЕТ". Принимаю данные в массив байт:

Код: Выделить всё
Код: Выделить всё
        Dim baData() As Byte
        ReDim baData(bytesTotal) As Byte
       
        w_In.GetData baData



Принятый массив: 208 159 209 128 208 184, т.е. 6 букв. пока что все правильно.

Ничего не правильно. Как ты отправляешь слово «ПриВЕТ»?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 19.03.2014 (Ср) 14:14

С клиента (Android), вот код если он уместен:
Код: Выделить всё
                    try
                    {
                       String message_uni = new String(message.getBytes(), Charset.forName("UTF-8"));

                        InetAddress serv_addr = InetAddress.getByName(IPServer);
                        DatagramSocket sock = new DatagramSocket();
                        byte [] buf = (message_uni).getBytes();
                        DatagramPacket pack = new DatagramPacket(buf, message_uni.length(), serv_addr, 8888);
                        sock.send(pack);
                        sock.close();
                        for (int i=0; i<buf.length;i++) buf[i]=0;
                        Log.i("UDP", "Send " + message);
                    }
                    catch (Exception e){
                        Log.d("UDP", "Send Error: " + e);
                    }


ps/ кстати, строку можно и не кодировать принудительно utf-8, так как у Android'а по умолчанию все строки в уникоде
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять Unicode...

Сообщение Хакер » 19.03.2014 (Ср) 16:22

Ну этот код непраивльный, потому что слово «ПриВЕТ» в UTF-8 будет занимать 12 байтов, а не шесть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 20.03.2014 (Чт) 12:45

Странно, код брал с примеров и все примеры, на другом форуме, только такие или в том же духе...
Проблем не возникает когда я отправляю строку в без русских букв
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Опять Unicode...

Сообщение Jack Ferre » 20.03.2014 (Чт) 13:00

В ответ получаю только 208 и все.

Каким образом? У меня функция Utf8ToUcs2 из ваших
208 159 209 128 208 184

возвращает "При".
Почему только половина?
Размер датаграммы у вас message_uni.length() - длина строки = 6 символов.
Используйте длину массива buf.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 20.03.2014 (Чт) 13:10

Дельное замечание) Спасибо, сейчас попробую
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 20.03.2014 (Чт) 13:28

Действительно дело было именно в этом (стыдоба ппц просто).


Но теперь появилась следующая проблема, если с функцией Хакера определять функцию так:
Код: Выделить всё
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, lpMultiByteStr As Any, ByVal cchMultiByte As Long, lpWideCharStr As Any, ByVal cchWideChar As Long) As Long

все работает отлично. Но валиться функция кодирование в utf-8 на оправку:
'ôóíêöèÿ ïðåîáðàçîâàíèÿ ASCII â UNICODE
Public Function EncodeUTF8(strSrc As String) As String
Dim nLen As Long
Dim strDst As String
Dim strRet As String
Dim nRet As Long
Dim p As Long

nLen = Len(strSrc)
strDst = String(nLen * 2, Chr(0))
strRet = String(nLen * 2, Chr(0))
p = StrPtr(strDst)
nRet = MultiByteToWideChar(0&, &H1, strSrc, nLen, p, nLen)
nRet = WideCharToMultiByte(65001, 0, p, nRet, StrPtr(strRet), nLen * 2, ByVal 0, 0)
EncodeUTF8 = Left$(StrConv(strRet, vbUnicode), nRet)
End Function


А если так:
Код: Выделить всё
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long

То функция работает нормально, но вот функция Хакера отдает только 1 байт.

В чем может быть проблема, и почему одну и туже функцию API можно определять по разному?
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Опять Unicode...

Сообщение Jack Ferre » 20.03.2014 (Чт) 14:02

Код: Выделить всё
Private Declare Function MultiByteToWideCharDecode Lib "kernel32" Alias "MultiByteToWideChar" (ByVal CodePage As Long, ByVal dwFlags As Long, lpMultiByteStr As Any, ByVal cchMultiByte As Long, lpWideCharStr As Any, ByVal cchWideChar As Long) As Long
Private Declare Function MultiByteToWideCharEncode Lib "kernel32" Alias "MultiByteToWideChar" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять Unicode...

Сообщение Хакер » 20.03.2014 (Чт) 15:53

Sirik, вот мне что не нравится: у тебя нет кристального ясного представления происходящих вещей. И действуешь ты чем-то вроде метода тыка. Это недопустимо, во-первых. А во-вторых, даже интересно, как вообще можно испытывать такое отношение к выполняемой работе?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 20.03.2014 (Чт) 18:20

Не совсем методом тыка) Просто недопонял почему в разных примерах по разному функции определены.

Спасибо всем за помощь
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять Unicode...

Сообщение Хакер » 20.03.2014 (Чт) 18:43

Sirik писал(а):Просто недопонял почему в разных примерах по разному функции определены.

Давай разберёмся. Пойдём от противного и спросим: а почему бы и нет?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Опять Unicode...

Сообщение ger_kar » 20.03.2014 (Чт) 19:15

Sirik писал(а):Просто недопонял почему в разных примерах по разному функции определены.
Все очень просто. Любая функция принимает только определенное количество аргументов и определенного типа, и ждет, что именно это и будет положено в стек вызывающей стороной. Изменить это уже никак нельзя. А вот объявляя функцию по разному, мы по сути, указываем компилятору VB, что и каким образом следует положить в стек при вызове данной функции. Причем сам вызов следует оформлять в зависимости от того, каким образом была объявлена эта функция.

Причем например тип Any подразумевает под собой любой тип передаваемый по ссылке(передается указатель), но позволяющий при вызове переопределить директивой byVal на вызов по значению, что во многих случаях является очень удобным.
Бороться и искать, найти и перепрятать

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 20.03.2014 (Чт) 21:28

Хакер писал(а):
Sirik писал(а):Просто недопонял почему в разных примерах по разному функции определены.

Давай разберёмся. Пойдём от противного и спросим: а почему бы и нет?

Я всегда думал, что объявление любой функции должно быть уникальным. Другое дело дать разные имена. Как показал Jack Ferre, дал разные имена. Я же спрашивал почему в примерах функция с одним и тем же именем определяется по разному.
По другому объяснить не могу, к сожалению(

2 ger_kar: я знаю что тип Any, просто не мог понять что можно так делать
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять Unicode...

Сообщение Хакер » 21.03.2014 (Пт) 3:58

Sirik писал(а):Я всегда думал, что объявление любой функции должно быть уникальным.

В пределах чего?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 21.03.2014 (Пт) 10:34

Не много не так выразил мысль: я имел в виду, что есть описание функции в справочнике значит функция определяется согласно справочнику. Но из-за спешки не обратил внимания на тот же тип Any.
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять Unicode...

Сообщение Хакер » 21.03.2014 (Пт) 10:44

Sirik писал(а): я имел в виду, что есть описание функции в справочнике значит функция определяется согласно справочнику.

Как так не вспомнить поговорку про авторитет истины и истину авторитетов.

Нет, нет такой силы в системе, которая бы проверяла, соответствует ли объявление функции в коде объявлению в каких-то там кем-то написанных сомнительных справочниках.

Функция должна получить то, что она ждёт, и в таких количествах, в каких она ждёт. Как при этом она объявлена — никому нет дела.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 21.03.2014 (Пт) 12:07

Ну в общем я все понял. Хакер еще раз спасибо
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять Unicode...

Сообщение Хакер » 21.03.2014 (Пт) 12:28

Да нет, не всё.

Теперь объясни, зачем в первом посте ты пишешь про конфертацию UTF8→ASCII и ASCII→UTF8.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 21.03.2014 (Пт) 12:40

Потому что клиенты (Android) всю информацию по сети посылают и получают в unicode. А сервер (VB) работает с ascii.
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять Unicode...

Сообщение Хакер » 21.03.2014 (Пт) 12:44

Sirik писал(а):А сервер (VB) работает с ascii.

Вот здесь какая-то чёрная дыра.

Нормальные приложения в современном мире обязаны все строки держать в юникоде. Андроид-приложения в этом плане делают правильно. Вопрос в том, почему VB-сервер не следует этому принципу?

Почему ты утверждаешь, что VB-сервер работает с ASCII, особенно с учётом того, VB для представления строк внутри себя использует именно юникод? Потому что ты опять неправильно понимаешь суть происходящих вещей, или потому что кто-то особо постарался и каким-то извращённым образом написал код так, что для всех строк используется действительно ASCII (о ужас, о боги).

:?:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Re: Опять Unicode...

Сообщение Sirik » 21.03.2014 (Пт) 14:24

Вот пример:
1. клиент шлет запрос такого вида: 100,100,ПриВЕТ;
2. если сервер принимает строку в unicode и не переведет ее в ascii, то будет билиберда, поэтому я перевожу unicode в ascii;
3. далее анализирую принятый пакет и отсылаю ответ, например 200,Хорошо. При отправке кодирую в unicode и отправляю.

Как по другому сделать я знаю и не знаю есть ли смысл?
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Опять Unicode...

Сообщение Хакер » 21.03.2014 (Пт) 14:46

Вот я так и знал, что там ад с кодировками.

Пойми, что то, что ты делаешь, уже бесспорно является криминальным. Ты делеаешь неправильный код. Ты пишешь код, за который надо уволнять. Это факт. Давай теперь разберёмся, как не делать криминальных вещей.

Вообще, к сожалению, не существует единиц, в которых бы измерялась глупость и нелепость технический решений. Поэтому я не могу измерить/выразить нелепость твоего решения в виде какого-то числа. Остаётся только привести в пример что-то эквивалентное по глупости и нелепости.

Представь себе, что для передачи фотографий с цифровой камеры на компьютер используется такой подход: фотографии на фотоаппарате из JPEG конвертируются в GIF с 16-цветной палитрой, и в таком виде передаются по кабелю. На компьютере они из 16-цветных GIF конвертируются опять в JPEG.

В качестве доказательства того, что этот метод очень даже неплох, приводится тот факт, что кто-то сфотографировал чёрную букву «Ы» на белом фоне и передал её на компьютер, и полученный в результате на компьютере JPEG-файл с фотографией буквы «Ы» имел вполне приличное качество.

Посыл понятен?

Разделю проблему на практическую и теоретическую стороны.

Теоретическая сторона:
Ты обязан прочитать вот эту статью, желательно несколько раз, до достижения просветления. Фактом наступления просветления будет искреннее желание посыпать голову пеплом от осознания нелепости всего того, что было сделано до того.

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

Практическая сторона:
Sirik писал(а):если сервер принимает строку в unicode и не переведет ее в ascii, то будет билиберда, поэтому я перевожу unicode в ascii;

Тут хочется спросить: да с чего бы это ради?

Спецификация протокола(*) предполагает, что строки передаются в юникоде, способ кодирования: UTF-8.
Устройство языка VB6 в частности и платформы COM вообще предполагает, что строки хранятся в юникоде, способ кодирования: UCS-2.

Таким образом, нужно из UTF-8 перекодировать в UCS-2. И там, и там — юникод.
Вопрос: где тут хоть на минуту возникает необходимость делать деструктивное преобразование, как ты его называешь, «Unicode→ASCII»? Где? Зачем?

_________

* — я боюсь что здесь даже спецификация протокола не придумывалась, и в каком виде передавать строки при сетевом обмене было решено не исходя из того, что реально требуется для проекта, а исходя из подхода «шлём в том виде, в каком получается слать (прилагая минимум усилий)».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 9

    TopList