Кодировки, кодировки... |
Здравствуйте, гость ( Вход | Регистрация )
Кодировки, кодировки... |
Rocky |
26.2.2010, 18:57
Сообщение
#1
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Всем привет!
Подскажите плиз с таким моментом. Беру текстовый файл, открываю, прогоняю его через QTextStream с заданной кодировкой, сохраняю... Все ок. Если 2-й раз сделать тоже самое - вместо русских букв кракозябры... Это нормально? ) Просто как-то непонятно... Помогите разобраться плиз ) Т.е. изначально у файла win1251. Прогнал сохранил в utf-8. На этом моменте все ок.. Потом опять его беру и прогоняю в utf-8 - вместо русских комментов - чушь... ( Ощущение что это как-то связано с юникодом... Вот функция:
Вот в этом месте я так поинмаю что name() возвращает не кодировку файла, а кодировку которую я выставил для всего приложения (вызовом статической функции)
так ведь? |
|
|
kwisp |
26.2.2010, 19:11
Сообщение
#2
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
Вот в этом месте я так поинмаю что name() возвращает не кодировку файла, а кодировку которую я выставил для всего приложения (вызовом статической функции) по-моему да. а что ты собственно хочешь сделать? sWantedCodec.toStdString().c_str() это минимум можно заменить на sWantedCodec.toAscii() или sWantedCodec.toLatin1() Сообщение отредактировал kwisp - 26.2.2010, 19:12 |
|
|
Rocky |
26.2.2010, 19:28
Сообщение
#3
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
sWantedCodec.toStdString().c_str() это минимум можно заменить на sWantedCodec.toAscii() или sWantedCodec.toLatin1() Исправил, спасибо) Я хочу сделать бесплатный =) перекодировщик файлов. Уже думал что написал, но обнаружил вот такую вещь. Повторюсь: есть файл с какой-то кодировкой (я так думаю что неважно какой). Я хочу его какбы пересохранить с заданной кодировкой. Функция перекодирования выше. Получается, что один раз она срабатывает нормально.. Т.е. на выходе я получаю совершенно нормальный файл с заданной кодировкой. А на 2-й такой "прогон" (того же самого файла) я получаю
вместо русских букв ( Вот интерфейсик такой получился: Сообщение отредактировал Rocky - 26.2.2010, 19:31 |
|
|
BRE |
26.2.2010, 19:40
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Т.е. изначально у файла win1251. Прогнал сохранил в utf-8. На этом моменте все ок.. Потом опять его беру и прогоняю в utf-8 - вместо русских комментов - чушь... ( Ощущение что это как-то связано с юникодом... Есть файл in.txt в кодировке win1251. Ты его конвертируешь в UTF-8 и сохраняешь в файл out.txt. После этого ты берешь файл out.txt и пытаешься его еще раз конвертировать из win1251 в UTF-8? |
|
|
Rocky |
26.2.2010, 19:52
Сообщение
#5
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Сорри, в конце недели туго с речью)
Есть файл in.txt в кодировке win1251. Я его конвертирую в utf-8 и сохраняю в out.txt. Потом in.txt удаляю, out.txt копирую с новым именем (in.txt), потом out.txt удаляю - т.е. как бы меняю имя файла.
В итоге новый in.txt в кодировке utf-8. Затем беру этот новый in.txt и снова его конвертирую в туже utf-8.... Он ведь не должен меняться если он уже в этой кодировке? Или нет? или я туплю ( |
|
|
BRE |
26.2.2010, 20:04
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Он ведь не должен- меняться если он уже в этой кодировке? Или нет? или я туплю ( Как-же не должен, именно должен меняться. Если ты ошибешься с исходной кодировкой, ты всегда будешь видеть кашу. А сейчас ты именно ошибаешься, файл в кодировке UTF-8 а ты его читаешь как win1251. |
|
|
Litkevich Yuriy |
26.2.2010, 20:05
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Rocky |
26.2.2010, 20:21
Сообщение
#8
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Т.е. нужно сначала определить исходную кодировку,затем написать так
Т.е. установить "потоку исходного файла" нужную кодировку и затем уже его считывать и перекодировать в заданной, так? А я почему-то решил что когда делаеш так QTextStream oInStream(&oSourceFile); - oInStream уже в нужной кодировке (в кодировке файла oSourceFile)... Значит пошел разбираться как определять исходную кодировку... Где-то тут вроде уже речь шла про это, остановились вроде как на notepad++. Вобщем, поищу его исходники. Наверное так. UPD дак ведь есть уже: %QTDIR%\examples\tools\codecs можешь на его основе сделать, заодно и посмотришь как это делается. О, спасибо ) UPD оказывается %QTDIR%\examples\tools\codecs не позволяет определить автоматически кодировку ( Сообщение отредактировал Rocky - 26.2.2010, 21:15 |
|
|
SABROG |
26.2.2010, 21:30
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
не позволяет определить автоматически кодировку Qt умеет определять только UTF16/32 по BOM'у. Так что на него не полагайся. Твоя задача сводится к реализации своего варианта программы "Штирлиц", но даже она ошибается. Поэтому проси пользователя, чтобы жестко задавал исходную и желаемую кодировки, если автоматически определить не удалось. Думаю в интернете должны быть статьи как по частотному анализу букв определить кодировку файла. В разных языках частота встречаемости тоже разная Может быть даже готовые библиотеки есть какие-нибудь. Простой алгоритм заключает в том, чтобы последовательно предполагать кодировки файлов и пытаться конвертировать другую, затем подсчитывать встречаемость букв. Но этот алгоритм будет работать только на более менее больших файлах, где русский и английский текст не миксуются 50/50. Сообщение отредактировал SABROG - 26.2.2010, 21:32 |
|
|
Rocky |
26.2.2010, 21:59
Сообщение
#10
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Мдя... а я думал за пару часиков напишу все ) Видимо придется повозиться, если запал не пройдет )
|
|
|
Текстовая версия | Сейчас: 26.12.2024, 23:56 |