powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Куда катится C++
25 сообщений из 285, страница 9 из 12
Куда катится C++
    #39303207
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОпиши пожалуйста конкретный кейс (желательно для языков стран ЕС) когда нам не хватает API Utf-16.Нету такого API.
Есть (уже странное) желание работать с юникодными строками, как с массивом символов. Не выходит. И никогда не получится, поскольку базовое понятие юникода - составные символы.
Таким образом, я не могу просто "ткнуться по индексу" и начать "что-то делать" - сначала надо должен проверить "а не попал ли я куда-то в середину составного символа".
Будут символы составными или нет зависит не от кодировки , а от нормализации.
А если при любой кодировке надо работать с символами переменной ширины, то UFT-16/UTF-32 не получают никаких таких особых преимуществ перед UTF-8.
Наоборот, UTF-8 становится предпочтительной кодировкой, т.к. она обеспечивает обратную совместимость с US-ASCII и возможность работы с юникодом при минимальных правках реализаций, сделанных для US-ASCII.
...
Рейтинг: 0 / 0
Куда катится C++
    #39303209
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, еще раз прошу. Опиши кейс использования который мы используем неправильно.
...
Рейтинг: 0 / 0
Куда катится C++
    #39303212
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonBasil A. Sidorov, еще раз прошу. Опиши кейс использования который мы используем неправильно.Ёжики зелёные!
В кодировке UTF-16 это будет 28 байт в нормализации C/KC и 32 байта - в нормализациях D/KD. В UTF-8 - 26 и 30 байт, соответсвенно.

Таким образом , в русском алфавите кириллического блока юникода есть четыре символа переменной ширины - "ёЁйЙ".

Вы всё ещё хотите обращаться с юникодными символами, как с массивом знакомест?
...
Рейтинг: 0 / 0
Куда катится C++
    #39303215
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int _tmain(int argc, wchar_t * argv[])
{
	const wchar_t s1[] = L"ё";
	const wchar_t s2[] = L"\x0435\x0308";


	int result = ::CompareStringEx(
		LOCALE_NAME_INVARIANT,
		0, 
		s1, -1,
		s2, -1,
		nullptr,
		nullptr,
		0);

	return result;
}



таки равны строки
...
Рейтинг: 0 / 0
Куда катится C++
    #39303222
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилтаки равны строкиЯсен перец, что равны.
Корректная работа с юникодными строками может быть обеспечена при любой кодировке. В ICU их (кодировок) штук двадцать, наверное.

Речь, вообще-то, о несколько другом.
Апологеты Win API утверждают, что UTF-16 - филосовский камень, а это совсем не так.

P.S. Вот когда (если) вы реализуете CompareStringEx() для разных кодировок - тогда и можно будет предметно побеседовать о преимуществах кодировок с фиксированным размером кодовых точек.
Правда, подозреваю, что тогда и предмет обсуждения исчезнет за полной эфемерностью.
...
Рейтинг: 0 / 0
Куда катится C++
    #39303225
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov Таким образом , в русском алфавите кириллического блока юникода есть четыре символа переменной ширины - "ёЁйЙ".Не ошибаетесь?

Вот к примеру "ё" http://www.fileformat.info/info/unicode/char/0451/index.htm

Ниже приведен код.
В отладчике установите останов на строке return result; и посмотрите native представление строки s1

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
#include "windows.h"
#include "stdio.h"

// --------------------------------------------------------
//
int wmain(
 int      argc, 
 wchar_t  *argv[]
) {

 const wchar_t s1[] = L"ё";
 const wchar_t s2[] = L"\x0435\x0308";
 
 int result = ::CompareStringEx(
  LOCALE_NAME_INVARIANT,
  0, 
  s1,
  -1,
  s2,
  -1,
  nullptr,
  nullptr,
  0
 );
 
 return result;

}                                                          // int _tmain(
...
Рейтинг: 0 / 0
Куда катится C++
    #39303227
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПравда, подозреваю, что тогда и предмет обсуждения исчезнет за полной эфемерностью.
предмет и так нет.
...
Рейтинг: 0 / 0
Куда катится C++
    #39303229
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012В отладчике установите останов на строке return result; и посмотрите native представление строки s1
\x0451 - что не так?
...
Рейтинг: 0 / 0
Куда катится C++
    #39303230
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил\x0451 - что не так?
Basil A. Sidorov утверждает, что
Basil A. Sidorov Таким образом , в русском алфавите кириллического блока юникода есть четыре символа переменной ширины - "ёЁйЙ".Если его правильно понял, то "ё" например представлена не двух байтным кодом.
А каким?

Еще раз http://graphemica.com/ё
...
Рейтинг: 0 / 0
Куда катится C++
    #39303232
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012,

многострадальная ё независимо от кодировки (UTF-8,UTF-16 и т д) может быть представлена как одной кодовой точкой (U+0451), так и двумя - (U+0435) (U+0308)
...
Рейтинг: 0 / 0
Куда катится C++
    #39303233
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov Таким образом , в русском алфавите кириллического блока юникода есть четыре символа переменной ширины - "ёЁйЙ".
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#include "windows.h"
#include "stdio.h"

int wmain(
 int      argc, 
 wchar_t  *argv[]
) {

 const wchar_t s1[] = L"ёЁйЙ";
 
 return 0;

}

В отладчике посмотрите на коды символов ...
...
Рейтинг: 0 / 0
Куда катится C++
    #39303243
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При сравнении через Collator с указанием особенностей страны + языка все чики-пики.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
import java.text.Collator;
import java.util.Locale;

import static java.lang.System.out;

public class Main3 {

    public static void main(String[] args){

        Collator en_USCollator = Collator.getInstance(new Locale("en","US"));
        Collator ru_RUCollator = Collator.getInstance(new Locale("ru","RU"));

        String s1 = "ё";
        String s2 = "ё";
        out.printf("( s1 == s2 ) = %s \n" , (s1.equals(s2)));

        out.printf("en_USCollator.equals(s1,s2) = %s \n", en_USCollator.equals(s1,s2));

        out.printf("ru_RUCollator.equals(s1,s2) = %s \n", ru_RUCollator.equals(s1,s2));

    }

}



Код: java
1.
2.
3.
( s1 == s2 ) = false 
en_USCollator.equals(s1,s2) = false 
ru_RUCollator.equals(s1,s2) = true 
...
Рейтинг: 0 / 0
Куда катится C++
    #39303244
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилмногострадальная ё независимо от кодировки (UTF-8,UTF-16 и т д) может быть представлена как одной кодовой точкой (U+0451), так и двумя - (U+0435) (U+0308)Решил проверить возможность получения ё с внутренним представлением (U+0435) (U+0308).
Вообщем FAR и notepad++ не умеют работать с UTF-16.
google помог нашел http://akelpad.sourceforge.net/.
Создал текстовый файлик, содержащий текст "ёЁйЙ" и с помощью FAR посмотрел кодовое представление.
Итого имеем:
0000000000: FEFF 0451 0401 0439 0419 ?ёЁйЙ

На всякий случай кому интересно ниже приведено объяснение почему в начале файла находится код 0xFEFF
https://ru.wikipedia.org/wiki/UTF-16
Код: plaintext
1.
2.
3.
4.
5.
Для определения порядка байтов используется метка порядка байтов (англ. Byte order mark).
В начале текста записывается код U+FEFF. При считывании, если вместо U+FEFF считалось U+FFFE, значит 
порядок байтов обратный, поскольку символа с кодом и U+FFFE в Юникоде нет. Так как в кодировке UTF-8 не 
используются значения 0xFE и 0xFF, можно использовать метку порядка байтов как признак, позволяющий 
различать UTF-16 и UTF-8
...
Рейтинг: 0 / 0
Куда катится C++
    #39303245
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Вообщем FAR и notepad++ не умеют работать с UTF-16.
композитные символы не имеет никакого отношения к кодировке
...
Рейтинг: 0 / 0
Куда катится C++
    #39303249
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Если его правильно понялНеправильно.
Один и тот же символ может быть представлен как одним кодом, так и несколькими. От кодировки это не зависит.
Поэтому, вне зависимости от кодировки, символы юникода должны рассматриваться, как имеющими переменную длину.
...
Рейтинг: 0 / 0
Куда катится C++
    #39303250
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем то Basil A. Sidorov предостерегает, что с строкой в коде UTF-16 нельзя работать как с массивом.
Что-то в этом есть.
Может кто четко сформулировать в каком случае так с ней работать нельзя?
Вообщем то согласно https://ru.wikipedia.org/wiki/UTF-16 понятно когда UTF-16 имеет не двух байтовый код.
Но если не ошибаюсь, то для программ, которые работают с общепринятыми кодовыми страницами /CP1251, .../ мы не столкнемся с багами ...

См. что говорится на странице https://ru.wikipedia.org/wiki/Юникод

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Кодовое пространство

Хотя формы записи UTF-8 и UTF-32 позволяют кодировать до 231 (2 147 483 648) кодовых позиций, было 
принято решение использовать лишь 1 112 064 для совместимости с UTF-16. Впрочем, даже и этого на текущий 
момент более чем достаточно — в версии 6.0 используется чуть менее 110 000 кодовых позиций (109 242 
графических и 273 прочих символа).

Кодовое пространство разбито на 17 плоскостей (англ. planes) по 216 (65 536) символов. Нулевая плоскость 
(plane 0) называется базовой (basic) и содержит символы наиболее употребительных письменностей. 
Остальные плоскости — дополнительные (supplementary). Первая плоскость (plane 1) используется в основном 
для исторических письменностей, вторая (plane 2) — для редко используемых иероглифов китайского письма 
(ККЯ), третья (plane 3) зарезервирована для архаичных китайских иероглифов[31]. Плоскости 15 и 16 
выделены для частного употребления[7].
...
Рейтинг: 0 / 0
Куда катится C++
    #39303252
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилкомпозитные символы не имеет никакого отношения к кодировкеНу в таком случае имеем право работать с строкой в UTF-16 как с массивом.
...
Рейтинг: 0 / 0
Куда катится C++
    #39303253
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПри сравнении через Collator с указанием особенностей страны + языка все чики-пикиТолько это не из-за мифических пузырьков UTF-16.
...
Рейтинг: 0 / 0
Куда катится C++
    #39303255
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Ну в таком случае имеем право работать с строкой в UTF-16 как с массивом.Имеете. Только лажать будете.
А если не будете - код получится ничуть не проще и ничуть не эффективнее, чем при работе со строками как с массивом байт в кодировке UTF-8.
...
Рейтинг: 0 / 0
Куда катится C++
    #39303256
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кодовая точка U+1F682 STEAM LOCOMOTIVE 🚂


в разных кодировках:
Код: plaintext
1.
2.
UTF-8 	0xF0 0x9F 0x9A 0x82
UTF-16	0xD83D 0xDE82
UTF-32	0x0001F682 


в случае (U+0451) и (U+0435) (U+0308) - представление Ё различно при использовании ОДНОЙ кодировки
Код: plaintext
1.
UTF-8              0xD1 0x91        и     0xD0 0xB5 0xCC 0x88
UTF-16,UTF-32       0x0451          и     0x0435 0x0308
...
Рейтинг: 0 / 0
Куда катится C++
    #39303258
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovmaytonПри сравнении через Collator с указанием особенностей страны + языка все чики-пикиТолько это не из-за мифических пузырьков UTF-16.
Вася. Как часто в своей практике ты встречал букву Ё закодированную т.н. кодовыми точками или двумя
символами UTF-16 ?

Только по чесноку.
...
Рейтинг: 0 / 0
Куда катится C++
    #39303261
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Изопропилкомпозитные символы не имеет никакого отношения к кодировкеНу в таком случае имеем право работать с строкой в UTF-16 как с массивом.
как паровозик в UTF-8 перекодируете?
...
Рейтинг: 0 / 0
Куда катится C++
    #39303262
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТолько по чесноку.В "старых" маках использовалась максимальная декомпозиция. Как в новых - не знаю.
У меня нет и не было ни старого, ни нового. Только что это меняет?
Хотя ... Есть встречный вопрос - вам часто приходилось "врукопашную" строки сравнивать?
А почему тогда вы так уверены, что UTF-16 круче, чем крутые яйца?
...
Рейтинг: 0 / 0
Куда катится C++
    #39303264
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonзакодированную т.н. кодовыми точками или двумя символами UTF-16 ?И, кстати, опять эта типичная ошибка.
Кодовые точки они тоже от кодировки не зависят - это просто числа.
И "широкое" представление "cyrylic letter yo" это два кода и один символ даже в UTF-16.
...
Рейтинг: 0 / 0
Куда катится C++
    #39303267
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovИмеете. Только лажать будете.
А если не будете - код получится ничуть не проще и ничуть не эффективнее, чем при работе со строками как с массивом байт в кодировке UTF-8.Давно присматривался к http://site.icu-project.org/, но пока не использовал.
1C 8.x использует.
Далее сказанное к 1С отношения не имеет.

Все используют library ICU
[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
25 сообщений из 285, страница 9 из 12
Форумы / C++ [игнор отключен] [закрыт для гостей] / Куда катится C++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]