Особенности языка mql5, тонкости и приёмы работы - страница 163

 
Nikolai Semko:

нет я бы заметил. Хотя не исключаю, что в некоторых случаях(при работе с юникод) такое возможно. В Java, например, тип char - 2 байта.
Пробовал парсить данные с криптобиржи в двух вариантах: через эту библиотеку JSON и через работу с массивом char. 
Разница получилась по скорости в 700(!!!) раз. Был в шоке. Возможно была далеко не лучшая реализация JSON.


символ это 16LE и строки очевидно из паскаля . Кстати и массивы из фортрана

 
Nikolai Semko:

нет я бы заметил. Хотя не исключаю, что в некоторых случаях(при работе с юникод) такое возможно. В Java, например, тип char - 2 байта.
Пробовал парсить данные с криптобиржи в двух вариантах: через эту библиотеку JSON и через работу с массивом char. 
Разница получилась по скорости в 700(!!!) раз. Был в шоке. Возможно была далеко не лучшая реализация JSON.

При передаче mql string в dll, на стороне dll, тип mql string принимается как wchar_t*
А не соответствие размера типов не только в Java можно встретить, это зависит от типа архитектуры, не помню чего, или операционной системы, или железа. 

700 раз? Фигасе, я как раз эту библиотеку отложил для JSON парсинга, значит не стоит она того?
И лучше строки переводить StringToCharArray и в цикле парсить массив?

 
Roman:

700 раз? Фигасе, я как раз эту библиотеку отложил для JSON парсинга, значит не стоит она того?
И лучше строки переводить StringToCharArray и в цикле парсить массив?

Думаю, что да. Хотя нужно всегда проверять. Делать замеры. Не исключаю, что функции работы со строками были написаны не лучшим образом, а сейчас их исправили. 
Эти замеры я делал больше года назад.

Кода, конечно же, будет больше при работе с char массивами, но зато более гибкие возможности.

 
Roman:

А скорее всего под mql стрингом там short[] или wchar_t[] или wchar_t*
Ведь строки mql в юникоде, а utf это 2 байта.
А StringToCharArray преобразует из short[] в char[]

юникод != utf  &&  utf != 2байта (utf utf'y рознь)  &&  MSVC не эталон

Смысл wchar_t - вместить любой поддерживаемый символ в одном wchar_t (ну о мелкомягких свой путь), а потоки ввода вывода сами конвертируют в/из кодировки локали. Никаких гарантий размера/кодировки. Когда принимаете в длл wchar_t, задумайтесь, а правильно ли это? Ну если конечно вообще интересно смотреть за пределы песочницы во взрослый мир.

 
Vict:

юникод != utf  &&  utf != 2байта (utf utf'y рознь)  &&  MSVC не эталон

Смысл wchar_t - вместить любой поддерживаемый символ в одном wchar_t (ну о мелкомягких свой путь), а потоки ввода вывода сами конвертируют в/из кодировки локали. Никаких гарантий размера/кодировки. Когда принимаете в длл wchar_t, задумайтесь, а правильно ли это? Ну если конечно вообще интересно смотреть за пределы песочницы во взрослый мир.

Да, я знаю что Unicode и UTF, это разные кодировки, и по идее чем то отличаются.
Просто так получилось, хотел написать и сократить слово юникод, наверно не удачно.

Хотя справка по Unicode гласит, что стандарт включает в себя знаки почти всех письменных языков мира.
Стандарт состоит из двух основных частей: универсального набора символов (англ. Universal character set, UCS) и семейства кодировок (англ. Unicode transformation format, UTF)

По этому как я думаю, Unicode уже содержит в себе кодировки UTF, по этому так выразился для сокращения написания слова.

Насчёт wchar_t* правильно или нет, даже не знаю.
Использовал то что в примерах Рената, из статьи как писать dll.
mql5 строки ведь в Unicode, который содержит в себе UTF, по этому думаю логично что в примере статьи используется wchar_t*
Чтобы вместить любой поддерживаемый символ в одном wchar_t.

Насчёт никаких гарантий размера/кодировки, даже не знал об этом, наверно тогда для чистоты использовать сишный short* ?
Если он конечно будет корректно поддерживаться IDE MSVC.
Так как на обычный true среда ругается, и подавай ей TRUE.

 

UTF-8 и UTF-16 имеют соответствующую битность.

В UTF-8 языковые страницы переключаются специальными кодами.

UTF-16 включает всё разнообразие символов одновременно.

 
Edgar Akhmadeev:

UTF-8 и UTF-16 имеют соответствующую битность.

В UTF-8 языковые страницы переключаются специальными кодами.

UTF-16 включает всё разнообразие символов одновременно.

Ну как я понял из того, что многие пишут на форуме, строки mql5 как раз в UTF-16
А в mql документации пишут:
Текстовая строка представляет собой последовательность символов в формате Unicode с завершающим нулем на конце.
По этому фиг поймёшь, в какой же всё таки кодировке mql5 строки.
А если Unicode содержит в себе уже все семейства UTF, зачем тогда вообще использовать слово UTF, и вводить путаницу.
Unicode и всё, просто и понятно.
Или нужно говорить так?
Unicode с битностью UTF-16 ?

Вообще кто то из разработчиков ранее пиал, что
mql тип string состоит из двух частей, буфер 8 байт и указатель 4 байта, в итоге 12 байт.

 
Roman:

Да, я знаю что Unicode и UTF, это разные кодировки, и по идее чем то отличаются.
Просто так получилось, хотел написать и сократить слово юникод, наверно не удачно.

Хотя справка по Unicode гласит, что стандарт включает в себя знаки почти всех письменных языков мира.
Стандарт состоит из двух основных частей: универсального набора символов (англ. Universal character set, UCS) и семейства кодировок (англ. Unicode transformation format, UTF)

По этому как я думаю, Unicode уже содержит в себе кодировки UTF, по этому так выразился для сокращения написания слова.

Насчёт wchar_t* правильно или нет, даже не знаю.
Использовал то что в примерах Рената, из статьи как писать dll.
mql5 строки ведь в Unicode, который содержит в себе UTF, по этому думаю логично что в примере статьи используется wchar_t*
Чтобы вместить любой поддерживаемый символ в одном wchar_t.

Вы запутались. Юникод - таблица символов с кодами, когда-то она влезала в 0-65535 (2 байта), потом выросла. А тратить 4 байта на символ жирно. Тут и сгодился utf - кодировка с переменной длиной (например, utf-8 кодирует ASCII символы одним байтом). Поэтому юникод (таблица) никакой utf в себе не содержит.

Насчёт никаких гарантий размера/кодировки, даже не знал об этом, наверно тогда для чистоты использовать сишный short* ?
Если он конечно будет корректно поддерживаться IDE MSVC.
Так как на обычный true среда ругается, и подавай ей TRUE.

В стандарт всунули char16_t, char32_t, типы с фиксированным размером. У wchar_t смысл иной.

 
Roman:

Ну как я понял из того, что многие пишут на форуме, строки mql5 как раз в UTF-16
А в mql документации пишут:
Текстовая строка представляет собой последовательность символов в формате Unicode с завершающим нулем на конце.
По этому фиг поймёшь, в какой же всё таки кодировке mql5 строки.
А если Unicode содержит в себе уже все семейства UTF, зачем тогда вообще использовать слово UTF, и вводить путаницу.
Unicode и всё, просто и понятно.
Или нужно говорить так?
Unicode с UTF-16 битностью ?

Это ещё не всё.

Как ANSI Cyrillic = CP1251, так

Unicode:

UTF-8 = CP65001, // UNIX/Linux

UTF-16LE = CP1200, // Windows

UTF-16BE = CP1251, 

UTF-32LE = ?,

UTF-32BE = ?,

ISO10646:

UCS-2 ~ UTF-16

UCS-4 = UTF-32

Путаница? Не, не слыхали.

 
Edgar Akhmadeev:

UTF-8 и UTF-16 имеют соответствующую битность.

В UTF-8 языковые страницы переключаются специальными кодами.

UTF-16 включает всё разнообразие символов одновременно.

Какие кодовые страницы, о чем вы вообще? "специальными кодами" определяется кол-во байт для кодирования символа, т.к. кодировка с переменной длинной. UTF-8 не хуже UTF-16 закодирует любой символ юникода. И utf-16 с переменной длиной (суррогатные пары).

Причина обращения: