|
|
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Столкнулся с проблемой вывода в Memo японских иероглифов. Имеем японскую фразу " こんにちは " (по русски - " Добрый день "). К сожалению форум не позволил мне вывести эти символы, поэтому вывожу графику: В кодовой таблице " SHIFTJIS " ( 932 ) это будет " 82B182F182C982BF82CD " (Hex). На Форме находятся кнопка " Button " и " Memo ", в свойствах шрифта которого выбрана Charset=" SHIFTJIS_CHARSET ". Процедура обработки нажатия кнопки: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. На выходе имеем вот такой результат: Подскажите плизз - как решить задачку? P . S . И еще попутный вопрос - как добавить в Дэлфи кодовую таблицу 20932 ? (Что бы ее можно было для выбрать в свойстве Font.Charset для Memo !) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 11:56 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Bellic, всё замечательно расписано, кроме главных вводных: версия среды и версия операционки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:01 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
makhaonBellic, всё замечательно расписано, кроме главных вводных: версия среды и версия операционки. Пардон, еще же подумал, что надо бы сделать!..)) - Windows 7 6.1 (Build 7601: Service Pack 1), 32-bit, включена поддержка Японского языка. - Delphi® XE3 Version 17.0.4625.53395. P . S . я понял так, что свое сообщение я уже не могу подправить после опубликования? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:12 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Без unicode-строки текст в TMemo для указанного примера в любом случае будет искажен - неправильно будут отображаться либо русские символы, либо японские. Соответственно коды букв должны быть 2х байтные (Word), а не Byte ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:13 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
asutp2Без unicode-строки текст в TMemo для указанного примера в любом случае будет искажен - неправильно будут отображаться либо русские символы, либо японские. Соответственно коды букв должны быть 2х байтные (Word), а не Byte Дело в том что приведенный пример кода максимально приближен к Реальному проекту , а в нем идет побайтовое чтение из реального файла и вывод в Memo ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:21 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
И еще одна проблема - при чтении из файла среди "двухбайтовых" иероглифов могут встретиться "однобайтные" английские символы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:31 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Bellic, так не получится. нужно собрать нормальную юникодовую строку и затем её добавлять в memo. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:42 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
как вариант - прочитать сразу как строку. смысл файл читать побайтно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:43 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Bellic, операционной системе фиолетово, как хранятся символы у тебя в файлах, и твой же пример этот факт демонстрируется во всей красе :) Для решения проблемы используй unicode-строки, без уникода русские и японские символы одновременно в ansi отображаться не будут. исходные файлы нужно предварительно преобразовывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:44 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
makhaonкак вариант - прочитать сразу как строку. смысл файл читать побайтно? Я подумаю над этим, но ввиду необходимости вылавливания Упр.Символов в строке (А они там порой попадаются) - приходится читать побайтно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:47 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
asutp2Bellic, Для решения проблемы используй unicode-строки, без уникода русские и японские символы одновременно в ansi отображаться не будут. А Русских символов в файлах вообще нет! Там Английские и Японские! + Упр.Символы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:49 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Bellic, без разницы, хоть китайские . управляющие символы можно вполне зафильтровать в строке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:51 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
makhaonBellic, без разницы, хоть китайские . управляющие символы можно вполне зафильтровать в строке. Есть ли вариант - доработать указанный выше код, что бы увидеть Иероглифы? я еще слабо разбираюсь в Юникоде! Можете реально код подправленный привести? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 12:59 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Bellic, например так: Код: pascal 1. Если данные сохранить в файл в utf8. Если кодировка другая - то поменяй на нужную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 13:03 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
судя по этому: авторпри чтении из файла среди "двухбайтовых" иероглифов могут встретиться "однобайтные" английские символы! у тебя utf8 скорее всего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 13:07 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
makhaonBellic, например так: Код: pascal 1. Если данные сохранить в файл в utf8. Если кодировка другая - то поменяй на нужную. Исходный файл - вообще не Текстовый! Это двоичный файл прошивки для CPU в котором встречаются текстовые блоки на Английском, Японском и смешанном - ENG+JPN. Поэтому преобразовать его не получится! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 13:11 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Вообще, общая идея такая: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Но имей в виду, что за конструкции типа "j := j + AnsiChar(Bytes[i]);" в цикле надо бить палками, потому что это дико неэффективно, как по скорости, так и по выделению памяти. Так что этот говнокод - только для примера решения твоей проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 13:19 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Забыл добавить Код: pascal 1. в самом начале процедуры, редактировать нельзя :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 13:21 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Либо таким методом, через TEncoding. Причем ты можешь обоими методами перекодировать и английские символы. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 13:28 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Спасибо большое! - По разбираюсь пока с Кодами..) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 13:53 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Второй вариант мне больше понравился! Попробовал вариант с текстом ENG + JPN : Код: pascal 1. 2. Класс!!! Осталось решить - как при выводе на лету заменить внутри байт $ 0A на $ 40 (символ ' @ '), если таковой встретится!? Например если: Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 14:45 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
Ещё вариант: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Во втором варианте утечка памяти - все TEncoding с нестандартными кодировками нужно прибивать. StringReplace для замены "на лету", но лучше не "на лету". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 15:51 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
DunkinЕщё вариант: Код: pascal 1. 2. 3. 4. 5. 6. Так, как исходный массив не заканчивается на $00, то эта конструкция будет работать только пока память после него случайно забита нулями. Как только там появятся какие-то другие значения - в тексте будет мусор и может случиться AV. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 18:00 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
BellicDelphi® XE3 Version 17.0.4625.53395 Delphi 2009 и выше (т.е. в т.ч. и Delphi XE3) относятся к Unicode IDE. Это означает, что любые текстовые данные для вывода должны быть представлены в Unicode (UTF-16). Если ваши текстовые данные находятся в другом формате - их нужно предварительно преобразовать. Bellicв свойствах шрифта которого выбрана Charset="SHIFTJIS_CHARSET" Не нужно это делать. В Unicode вы не работаете с кодовыми страницами. BellicИ еще попутный вопрос - как добавить в Дэлфи кодовую таблицу 20932? Кодовая страница 20932 является частью Unicode. Она уже есть и используется. Не нужно её выбирать. И, кстати, по-моему, у вас данные - в 932, не в 20932. Bellicв нем идет побайтовое чтение из реального файла Читайте в RawByteString: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Или, если кодировка фиксирована, то можно так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Можно и через TEncoding, то смысла большого нет, больно громоздко для вашей задачи. BellicК сожалению форум не позволил мне вывести эти символы И ровно так же может случиться и в Delphi приложении. Чтобы пользователь успешно увидел правильный текст, нужно два компонента: - Текст должен быть представлен без потерь в подходящей для вывода кодировке - это мы сделали выше - В используемом шрифте должны быть отрисованы иероглифы, а не заглушки По шрифтам больше информации - тут: http://www.transl-gunsmoker.ru/2009/05/blog-post_3589.html Кратко: - Если у вас выбран шрифт по умолчанию (Tahoma), то система сама выберет подходящий шрифт (если он вообще есть в системе) - т.н. "Font Fallback". - Для старых систем лучше таскать шрифт с собой, поскольку в системе он может быть не установлен. Например, Arial Unicode MS. BellicОсталось решить - как при выводе на лету заменить внутри байт $0A на $40(символ '@'), если таковой встретится!? Управляющие символы преобразуются без изменений. Просто сконвертируйте в String и сделайте StringReplace (ну или циклом for). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2017, 19:22 |
|
||
|
Вывод в Memo японских иероглифов (932-я кодовая таблица)
|
|||
|---|---|---|---|
|
#18+
alekcvp, Пф-ф. ТС наверняка в состоянии написать через Move. В реальной жизни вряд ли будет через статический массив. При приведении PAnsiChar(TBytes) (оба типа managed, приводятся "на прямую") для строки будет выставлен размер TBytes? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2017, 02:18 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39570672&tid=2041272]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
179ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 496ms |

| 0 / 0 |
