|
|
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Может кто-нибудь на пальцах объяснить откуда взялись формулы в следующих методах: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Я могу понять только формулу в TUTF7Encoding, происхождение остальных для меня является загадкой. Скопировано из XE7, возможно в других версиях другие формулы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2017, 18:05:56 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Какие вопросы ставил перед собой и как на них отвечал ? Или вопросы не ставил, в виду ..., и ответ праздо нужен ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2017, 18:26:57 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev, Вот, кстати, мне тоже стало [праздно] интересно, откуда взялись первая и третья формулы?.. :) (автор темы не я) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2017, 19:24:25 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
alekcvp, можете глянуть на комментарии в дотнете UTF8 Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. UTF7 Код: c# 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. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2017, 20:04:35 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
white_niggeralekcvp, можете глянуть на комментарии в дотнете UTF8 Прочитал комментарии для UTF8 в дотнете и так и не понял почему 1 символ максимально занимает 6 байт, в то время как сейчас по стандарту максимальный размер одного символа 4 байта в UTF8. Если отталкиваться от UTF16 (с суррагатными парами, которые расширяют интервал до 20бит), то 1 символ всегда занимает 3 байта и только если это суррогатная пара - то 4 байта, но суррогатная пара это уже 2 символа, которые будут занимать 6 байт если это будут не суррогатные символы. Т.е. TUTF8Encoding.GetMaxByteCount всегда возвращает длину на 3 байта больше чем может быть в реальности. Если же отталкиваться от UTF32, то функция возвращает всегда меньше чем может занимать строка в реальности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 16:18:27 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Праздный интерес, В Википедии же всё написано https://ru.wikipedia.org/wiki/UTF-8 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 16:23:24 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Няшик, Именно википедией и пользовался, вот только в моих расчетах максимальный размер строки в байтах получается иной чем (CharCount + 1) * 3. ориентируемся на UTF16: 1 символ - всегда 3 байта (16 бит - 3 байта), суррогатная пара на то и суррогатная в 1 символ не вмещается 2 символа - либо 6 байт, для простых символов, либо 4, если суррогатная пара как можно заметить расчет по формуле всегда дает максимальны размер на 3 байта длиннее. ориентируемся на UTF32: 1 символ - 6 байт, но это не точно, ведь это только для 31бита 2 символа - 12 байт по формуле только размер 1 символа совпадает, дальше же он с каждым разом все больше и больше отстаёт. Я прошу показать где я ошибся в расчетах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 16:55:56 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
А в чем проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 17:04:29 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Праздный интерес, в тексте с .NET этого нет, но может дело в BOM. 3 байта для UTF8, 2 байта для UTF-16. Как раз получается, как в функциях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 17:10:29 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Праздный интересНяшик, ориентируемся на UTF16: 1 символ - всегда 3 байта (16 бит - 3 байта), суррогатная пара на то и суррогатная в 1 символ не вмещается 2 символа - либо 6 байт, для простых символов, либо 4, если суррогатная параМесье надо подтянуть матчасть Суррогатная пара - это и есть ОДИН символ, который в UTF16 кодируется четырьмя байтами (два WideChar), а в UTF8 шестью байтами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 18:06:40 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
white_niggerСуррогатная пара - это и есть ОДИН символ, который в UTF16 кодируется четырьмя байтами (два WideChar), а в UTF8 шестью байтами Суррогатная пара и в UTF-8 кодируется четырьмя байтами (максимальный кодпоинт юникода 10FFFF). Теоретически схема кодирования UTF-8 допускает 6-байтовые последовательности, но стандартом закреплены только 4-байтовые максимум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 19:20:29 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyСуррогатная пара и в UTF-8 кодируется четырьмя байтами (максимальный кодпоинт юникода 10FFFF). Теоретически схема кодирования UTF-8 допускает 6-байтовые последовательности, но стандартом закреплены только 4-байтовые максимумНу так мелкомягкие и пишут интересно: сначала "Characters would be # of characters + 1 in case left over high surrogate", что их может быть два, а потом не парясь " Max 3 bytes per char." Хотя и замечают, как ты сказал "(4 bytes per 2 chars for surrogates)" Я так понимаю, что никто не парится, раз допускается - значит max считают = 6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 19:49:25 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
white_niggerЯ так понимаю, что никто не парится, раз допускается - значит max считают = 6 Нет, они не парятся и за Max считают = 3... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 19:55:58 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
white_niggerЯ так понимаю, что никто не парится, раз допускается - значит max считают = 6 Я не понял из чего ты делаешь вывод о 6. У них, как раз, расчёт делается на то что, один кодпоинт из BMP это всегда 3 байта, а суррогатная пара представленная двумя такими кодпоинтами и кодирующаяся 4 байтами по любому влезет в 6 байт для двух обычных кодпоинтов. // Characters would be # of characters + 1 in case left over high surrogate is ? * max fallback Вот это, мне кажется, вообще ошибка. Тут, насколько я понимаю, говорится о возможном наличии одиночного старшего суррогата в конце строки (разделённая суррогатная пара) из-за чего будет задействоваться фолбек, который, как они считают (судя по комментарию), всегда 3 байта. Но тут возникает пара вопросов: 1. Если max fallback принят за 3 байта (а дефолтный replacement char в UTF-8 представляется именно 3 байтами), то нафига делать +1, ведь и нормальный кодпоинт из BMP по максимуми кодируется 3 байтами. 2. Какого фига max fallback принят за 3 байта, когда EncoderReplacementFallback можно инициализировать любой строкой, и он будет возвращать столько байт сколько хочется. В общем, или это ошибка или я не понимаю механизм работы фолбека в дотнете. p.s. Ну а дельфийские енкодерописатели тупо собезьянили дотнетовский код, вот и всё объяснение (потеряв фолбеки по пути). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 20:15:02 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyЯ не понял из чего ты делаешь вывод о 6 Думаю чтобы полностью кодировать UCS-4 Kazantsev Alexeyp.s. Ну а дельфийские енкодерописатели тупо собезьянили дотнетовский код, вот и всё объяснение (потеряв фолбеки по пути).Именно! (аналоги фолбеков пришлось писать для нашего рича) PS: Юникодная таблица вещь весьма непостоянная. Если в неё добавляют таккую хню как алхимические символы, то возможно когда-нить будет мало диаппазона 0-10FFFF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 20:35:02 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
А может и правда MS облажалась, а не думала о совместимости с будущим UNICODE и максимально возможной последовательности для UTF8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 20:41:32 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
white_niggerДумаю чтобы полностью кодировать UCS-4 UCS-4 это та же UTF-32, то есть форма представления юникода, а он ограничен 0-10FFFF. white_niggerИменно! (аналоги фолбеков пришлось писать для нашего рича) Аналогичная фигня... white_niggerто возможно когда-нить будет мало диаппазона 0-10FFFF Это вряд ли. UTF-16 не сможет кодировать всё что выше этого, а на неё слишком много всего завязано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 20:47:21 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
И всё таки они убеждены MaxByteSequenceLen = 6; // max bytes per character Это из реализации ридера Xml .NET Framework ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 20:55:02 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
white_niggerMaxByteSequenceLen = 6; // max bytes per character Которая, если верить рефлектору, нигде не используется :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 21:07:09 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey...если верить рефлектору Хотя, это же константа... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 21:20:22 |
|
||
|
TEncoding и его потомки
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyКоторая, если верить рефлектору, нигде не используется :)Фи.. рефлектор.. Проще в репозитории, в сырцах глянуть. Там используется в паре мест в методе ReadData ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2017, 21:27:43 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39531691&tid=2041750]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
424ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 706ms |

| 0 / 0 |
