LINUX.ORG.RU

koi8-r-исходник > utf8-консоль

 , , ,


0

1

Предисловие.

Есть поделие, которое мне надо сопровождать и дорабатывать, писавшееся в koi8-r кодировке. Есть четырнадцатая слака с настроенной юникод-локалью, есть QtCreator в ней. Qt Creator поставил не позже, чем вчера, сижу второй день, разбираюсь.

Играюсь.

Создаю простой проект _без_использования_qt_. Выставляю файлам проекта кодировку KOI-8R. Проект делает только две следующие строчки:

setlocale(LC_ALL, "ru_RU.koi8r");
cout << "тест";
Если в консоли xterm, запускаемой из IDE, выводятся крякозябры, то во внутренней консоли криэйтера — вообще ничего.

Подскажите, пожалуйста, как настроить.


Ответ на: комментарий от panter_dsd

Так ты используешь Кьют или нет?

В данном проекте — нет.

h0x0d9
() автор топика
Ответ на: комментарий от h0x0d9

gettext — не сторонняя библиотека.

А у меня с ее помощью замечательно работает локализация: и в нормальной (КОИ8) и в извращенной (юникод) консоли в случае русской локали получаются нормальные русские комментарии.

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)

Писалось на коленке для рекурсивного перекодирования всех файлов в текущей директории с расширениями .cpp .h и .sh из koi8-r в utf-8. Перекодируй весь свой проект и работай в utf-8.

#!/bin/bash

find . -type f \( -name "*.cpp" -o -name "*.h" -o -name "*.sh" \) -print | \
  (while read file; do
      cp $file /tmp/file
      iconv -f koi8-r -t utf8 /tmp/file > $file
  done);
m0rph ★★★★★
()
Ответ на: комментарий от h0x0d9

Мне его в МСВС запускать, где про utf8 еще не слышали.

Соболезную. Я в свое время выкручивался именно методом перекодирования: проект пишется, тестируется и отлаживается под нормальной ОС в utf-8 и время от времени делаются тестовые сборки под ущербное поделие, чтобы проверить работоспособность там. Вот для таких сборок проект автоматически перегонялся в koi8-r.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)

setlocale возвращает NULL?

staseg ★★★★★
()

Консоль в слаке с utf8 будет отображать только utf8. Чтобы исходники оставались в koi8r, можно заюзать флаги компилятора finput-charser foutput-charset. Я использовал их для кросскомпиляции под винду с её cp1251.

В .pro можно указать что-то вроде «QMAKE_CXXFLAGS += -finput-charser=koi8r -foutput-charset=utf8», то же самое для QMAKE_CFLAGS, но лучше глянуть официальную документацию GCC - я мог напутать с точными именами кодировок.

anonymous
()

выкинь к чертям все русские буквы из исходников, их там в принципе быть не должно

dt1 ★★
()
Ответ на: комментарий от h0x0d9

Он намекает на то что должны быть файлы ресурсов, а в исходниках только мета-константы соответствующие реальному тексту.

Jetty ★★★★★
()
Ответ на: комментарий от h0x0d9

Мне его в МСВС запускать, где про utf8 еще не слышали.

Тогда разумнее было бы организовать KOI8-R консоль у себя, чтобы потом не возникло неожиданных проблем.

annulen ★★★★★
()

Еще можешь попробовать fixnonlatin1 из git://gitorious.org/qt/qtrepotools.git, правда не уверен, что результат тебя устроит (вместо русских букв будут их коды)

annulen ★★★★★
()

вот вспомнил, что я хотел написать скрипт, который меняет все «русские сообщения» на определения препроцессора, дабы очистить код от кириллицы.

таки вот что получилось:

#!/bin/bash

declare -A rus2num
declare -a num2rus
COUNT=0

INC_FILE="rus2num.h"
: >$INC_FILE

function r2n()
{
	INPUT_FILE=$1
	if [ ! -r "$INPUT_FILE" ]; then
		echo "Can't open '$INPUT_FILE'"
		return 2
	fi
	TMP=`mktemp`
	cat "$INPUT_FILE" >$TMP
	while true; do
		RUS_WORD=`sed -rn '
		s/.*(["])([^"]*[абвгдеёжзийклмнопрстуфхцчшщьыъэюя][^"]*)\1.*/\2/i
			T
			p
			q' $TMP`
		if [ -z "$RUS_WORD" ]; then
			break
		fi
		echo "Found $RUS_WORD"
		if [ -z "${rus2num[$RUS_WORD]}" ]; then
			echo "New"
			(( COUNT++ ))
			rus2num[$RUS_WORD]=$COUNT
			num2rus[$COUNT]=$RUS_WORD
			C=$COUNT
			echo -e "#define RUS_MSG_$C \"$RUS_WORD\"" >>$INC_FILE
		else
			echo "Old"
			C=${rus2num[$RUS_WORD]}
		fi
		sed -i "s/\"$RUS_WORD\"/RUS_MSG_$C/g" $TMP
	done
	cat $TMP >"$INPUT_FILE.new"
	cat $TMP
	rm -vf $TMP
	return 0
}

while [ "$1" ]; do
	r2n "$1"
	err=$?
	if [ $err != 0 ]; then
		echo "Abort"
		exit $err
	fi
	shift
done
echo "OK"
особо не тестил... Но типа работает...

drBatty ★★
()
Ответ на: комментарий от drBatty

Ну вот зачем наркоманией страдать? GCC может сам преобразовать кодировки в бинарнике, а тут человек всё равно не использует gettext.

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

Ну вот зачем наркоманией страдать?

ну это такое полуавтоматическое выделение «ресурсов». не надо - не юзай. А вообще-то оно может пригодится для локализации проекта на иные языки кроме русского.

drBatty ★★
()

В xterm, наверное, вот это выводит?

ÔÅÓÔ

Похоже, у тебя просто не кои8-шрифт в нем.

Дальше. В твоем коде setlocale выставит локаль для самого кода, но не для программы, которая отображает твой stdout. Соответственно, надо запускать и саму отображающую программу тоже в локали кои8

Пробуй вот так:

LANG=ru_RU.koi8r konsole

и в ней выполнять уже ./programname . У проверил на своей slackware 14. Qtcreator компилить долго, не проверял, но по идее - запускать так же.

sin
()
Ответ на: комментарий от byte_men

И поиметь потом секаса с Qt5, где по умолчанию сделали кодек в utf8 и эти все trutf8 повыкидывали нахрен ибо костыль.

Gorthauer ★★★★★
()
Ответ на: комментарий от Gorthauer

а какой смысл слезать с QT4.8 на 5 в середине проекта??? и тем более кто мешает в исходниках заменить все trutf8 на что то другое... ctr-f и заменить все.

byte_men
()
Ответ на: комментарий от dt1

Да-да, а ещё программа не должна работать с ничем где есть русский язык, потому что русского языка не существует и все мы в матрице.

bhfq ★★★★★
()
Последнее исправление: bhfq (всего исправлений: 1)
Ответ на: комментарий от bhfq

а ещё программа не должна работать с ничем где есть русский язык

для этого в Qt есть tr(), а русский язык в тексте программы - явный признак быдлокодера

dt1 ★★
()
Ответ на: комментарий от dt1

ТСу не нужен Qt, он пишет код в Qt Creator.

Сторонние библиотеки, к сожалению нельзя, по тем же причинам. Из допуска только STL.
h0x0d9 (11.10.2012 12:04:24)

bhfq ★★★★★
()
Ответ на: комментарий от dt1

И почему же это признак быдлокодерства??? Название форм тоже на латинице делать? Название полей по умолчанию каких то например... Которые в последствии можно поменять пользователю.

byte_men
()
Ответ на: комментарий от byte_men

Название форм тоже на латинице делать?

внезапно - да, особенно, если на Qt

Название полей по умолчанию каких то например... Которые в последствии можно поменять пользователю.

в чем проблема? есть название по умолчанию на английском, которое переводишь на используемые языки

dt1 ★★
()
Ответ на: комментарий от m0rph

Соболезную. Я в свое время выкручивался именно методом перекодирования

Пошел по этому пути.

h0x0d9
() автор топика
Ответ на: комментарий от bhfq

та старая которая на red hat не etnerprise версии

Именно она, к сожалению.

h0x0d9
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.