Опять Unicode...

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

Re: Опять Unicode...

Сообщение Sirik » 21.03.2014 (Пт) 15:09

Я что-то запутался. Вот к примеру, если у нас есть строка:
Код: Выделить всё
Dim st as String
st = "hello"

Получается, что строка хранится в памяти в юникоде, кодировка UCS-2?

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

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

Re: Опять Unicode...

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

Sirik писал(а):Получается, что строка хранится в памяти в юникоде, кодировка UCS-2?

Именно.

Sirik писал(а):И если я скажем получаю массив байт (будущая строка), перевожу его в строку твоей функцией, то строка будет хранится в юникоде, кодировка UCS-2?

  1. Откуда получаешь массив байт?
  2. Что такое «моя функций»? Приведи конкретно код, потому что каких я только функций не писал.
  3. Кроме того, с чего ты решил, что к какому-то непонятному массиву байтов можно применять мою функцию? Если кто-то постулирует, что некий массив байтов олицетворяет строку, то либо где-то рядом с этим массивом байтов (или как часть его) должна быть информация о том, каким способом интерпретировать этот набор байтов как строку, либо та же самая информация должна быть закреплена в спецификации и неявно подразумеваться для любых подобных массивов. О чём, собственно, ты должен был понять из статьи, которую видимо не стал читать.
—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 (Пт) 16:00

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


Функция:
Код: Выделить всё
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


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

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

Re: Опять Unicode...

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

Ну, это конечно лучше, чем какие-то непонятные идеи конвертирования в 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 (Пт) 16:32

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

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

Re: Опять Unicode...

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

Sirik писал(а):Android передает и работает только с utf-8, так что думаю что все пакеты только в utf-8.

Не знаком с Андроидом, но уверен, что высказывание — не правда.

Но даже не это главное. Спецификация должна определять, как будет написано приложение. У тебя же получается, что код приложения определяет, как будет написана спецификация. Тут просто нет слов, ты понимаешь?

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 » 22.03.2014 (Сб) 8:54

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

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

Re: Опять Unicode...

Сообщение Хакер » 22.03.2014 (Сб) 17:50

Sirik писал(а):Ну вот и пришел к выводу, что все строки будут передаваться в utf-8, не вижу тут проблемы.

Ещё раз: есть проблема в подходе и в идеологии.[*]
Скинхеды имеют бритые головы.
Скинхеды придерживаются националистических взглядов.

Где правильная причинно следственная связь?
  • Наличие националистичееский взглядов → наличие бритой головы
  • Наличие бритой головы → наличие националистических взглядов
?

У тебя получается второй вариант. Есть ли у тебя такой документ, как спецификация протокола, который священен и первичен для вас? Я готов поспорить — нет. А должен быть. И если завтра станет совершенно точно ясно: мы не собираем даже близко поддерживать Андроид, зато должны поддерживать Windows Phone, который все строки внутри себя представляет в UCS-2 (на самом деле я не знаю, в чём он их представляет, и просто делаю предположение), то вы возьмёте и быстренько переделаете протокол так, что все строки до́лжно будет передавать в UCS-2. Это называется «спецификация как дышло».

Sirik писал(а):На счет текста: это простые текстовые посылки, например: 100.100.200.авпынпгаыв и так далее в тоже духе

Что означают и откуда берутся эти данные, особенно текстовая часть? Она может быть произвольной (её вводят пользователи) или набор строчек фиксирован?

Потому что если фиксирован, то нет никакого смысла передавать в юникоде ни числа, ни слова. Вернее, числа в любом случае нет. Единственная разумная причина передавать числа (и возможно — текст) в юникоде — это требование к невероятной гибкости и дальнейшей расширяемости протокола. Но нужна ли такая гибкость?

«100.100.200» занимает 11 байтов. Та же информация могла бы занимать 3 байта. И это было бы даже лучше, с точки зрения экономии трафика. Но на самом деле, экономия трафика — это в 1000 раз менее веская причина так делать, чем кое-что другое.

На самом деле, любые текстовые форматы предполагает необходимость написания сложного парсера. Любой, кто думает, что можно обойтись без сложного парсера — подобен наивному ребёнку. Можно обойтись, конечно, подписавшись создавать отвратительный софт.

Какие проблемы есть с текстом?
  • Что делать, если в тексте встретится две точки? (например 100..100.200)
  • Что делать, если встретится лишний пробел между числом и точкой? (например 100.100 .200)
  • Что делать, если придёт число длиннее, чем мы ожидали? (например 100.000000000000100.200)
  • Что делать, если придёт число больше, чем мы ожидали? (например 100.100.9544386846846878/6795435468754445611123)
  • Что делать, если придёт число с минусом, а мы ждём только положительные? (например 100.-25.200)
  • Что делать, если мы ожидаем и отрицательные тоже, но число пришло с двумя минусами? (например 100.--25.200)
  • Что делать, если число префиксировано плюсом: это допустимо или ошибка протокола? (например 100.+100.200)
  • Что делать, если посреди числа встретился пробел? (например 100.10 0.200)
  • Что делать, если придёт число с минусом, а мы ждём только положительные? (например 100.-25.200)
  • Что делать, если придёт число с буквой в середине? (например 100.10a0.200)
  • Что делать, если придёт число с буквой в в конце: (это ошибка или просто отбросить букву)? (например 100.100m.200)
  • Что делать, если придёт число в «научном формате записи»? (например 100.10e+0.200) При использовании самого глупого подхода в стиле «Split + каскад if-ов + встроенные функции типа Int» такое число будет схавано сервером.

И можно ещё продолжить этот список.

Вот просто три числа, а кол-во нештатных ситуаций перевалило за десяток. Чем более сложным будет протокол, тем больше будет число всяких ситуаций, безальтернативно нуждающихся в особой обработке силами сервера. И самое главное: прежде всего в спецификации нужно будет предусмотреть и описать правила обработки каждой из таких ситуаций. И ещё другой момент: нужно придерживаться каких-то политик по отношению к клиентам, которые шлют нарушенные датаграммы. Потому что если с TCP дело обстоит проще: клиент прислал фигню — отключили его нафиг, то с UDP возможности разорвать соединения нет (как нет и соединения), поэтому нужно придумывать какие-то варианта в зависимости от того, stateless-протокол у тебя или нет. Если не stateless, то конечный автомат для обработки всей этой логики будет просто дико сложным.
—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 » 25.03.2014 (Вт) 9:18

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

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

Re: Опять Unicode...

Сообщение Хакер » 25.03.2014 (Вт) 15:07

Sirik писал(а):Сейчас все работает отлично, большое спасибо

Это должно меньше всего радовать. Вот если бы ты сказал «Всё отлично спроектировано», то да.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Пред.

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

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

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

    TopList