Кодировка
Модератор: Модераторы разделов
-
apacho
- Сообщения: 110
- ОС: MOPSLinux 5.1
Кодировка
Пишу :
int main() {
char name[20],lod[30];
cout << "Введите имя :";
cin >> name;
strcat(lod,name);
strcat(lod,"/g");
FILE *fp=fopen(lod,"w");
if (fp==0) cout << "Не существует!";
}
Так вот, с английским словом всё отлично работает, а вот с русским всегда "Не существует!", кодировка KOI8-R,
какую лучше кодировку использовать для русского языка?
int main() {
char name[20],lod[30];
cout << "Введите имя :";
cin >> name;
strcat(lod,name);
strcat(lod,"/g");
FILE *fp=fopen(lod,"w");
if (fp==0) cout << "Не существует!";
}
Так вот, с английским словом всё отлично работает, а вот с русским всегда "Не существует!", кодировка KOI8-R,
какую лучше кодировку использовать для русского языка?
Окошки не нужны, нужны ПИНГВИНЫ!!!
Слака рулит!!!!!!
Слака рулит!!!!!!
-
Hvzh
- Сообщения: 711
- Статус: Gone with Linux
- ОС: Linux Mint 18.1
Re: Кодировка
UTF-8
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
-
apacho
- Сообщения: 110
- ОС: MOPSLinux 5.1
Re: Кодировка
С приведённым выше кодом всё отлично работает на юникоде, а вот с этим :
int main() {
char bif[30],d[]="взять";
cin >> bif;
if ((strncmp(bif,d,4))==0) cout << "ok";
}
Ввожу взять
выводит ok
Ввожу взят
выводит ok
И что с этим делать?
int main() {
char bif[30],d[]="взять";
cin >> bif;
if ((strncmp(bif,d,4))==0) cout << "ok";
}
Ввожу взять
выводит ok
Ввожу взят
выводит ok
И что с этим делать?
Окошки не нужны, нужны ПИНГВИНЫ!!!
Слака рулит!!!!!!
Слака рулит!!!!!!
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
-
Hvzh
- Сообщения: 711
- Статус: Gone with Linux
- ОС: Linux Mint 18.1
Re: Кодировка
А что вы ожидали то??? Поменяйте в strncmp 4 на 5
HP 255 G4 A6-6310 + Linux Mint 18.1 + Windoze7 under VmWare + OS X Mavericks under VmWare
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Кодировка
apacho писал(а): ↑08.08.2007 12:29Пишу :
Код: Выделить всё
int main() { char name[20], lod[30]; cin >> name;
Зря вы так пишете...
(это я так, мягко...)
Код: Выделить всё
char bif[30],d[]="взять";
cin >> bif;
if ((strncmp(bif,d,4))==0) cout << "ok";Не говоря уж о том, что юникод изобретали совсем не для того, чтобы потом вот так с ним "работать".
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Кодировка
Сильно удивлюсь, если поможет.
2 автор: поменяйте тогда уж на 10...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
apacho
- Сообщения: 110
- ОС: MOPSLinux 5.1
Re: Кодировка
Точно, увеличить на 10 помогает, потому что буква в юникоде занимает 2 байта(этого я к сожалению не знал).
Код
int main() {
char name[20], lod[30];
cin >> name;
char bif[30],d[]="взять";
cin >> bif;
if ((strncmp(bif,d,4))==0) cout << "ok";
А как надо? (я просто новичок)
Код
int main() {
char name[20], lod[30];
cin >> name;
char bif[30],d[]="взять";
cin >> bif;
if ((strncmp(bif,d,4))==0) cout << "ok";
А как надо? (я просто новичок)
Окошки не нужны, нужны ПИНГВИНЫ!!!
Слака рулит!!!!!!
Слака рулит!!!!!!
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Кодировка
И снова ошибка. Буква в юникоде вообще никаких байт не занимает. Просто. Совсем. В натуре. =)
Понятия "буква" в юникоде как бы тоже нету. Понятия "байт" вобщем тоже. =)
Ну если кратко, по этой вашей фразе, то у юникод есть много версий, понемногу сменяющих друг друга, и пять актуальных представлений: UTF-8 UTF-16(BE|LE)? и UTF-32(BE|LE)?
И несколько малоактуальных, например UTF-7.
И несколько устаревших но актуальных, например в Win API наск понимаю используется устаревший UTF-16LE в духе UCS-2.
Так вот, в ютф8 один "символьный кусок" юникода занимает 1, 2 или более октетов (ваши "байты"), не помню сколько там в стандарте максимум сегодня, 6 что ли. А "буква" может быть представлена одним, двумя, тремя и более (до пяти - легко) символьными кусками. Откуда имеем, что легко сочинить букву с пятком "умляутов" снизу и сверху, которая будет иметь в длинну (5 + 1) итого 6 символкусков или например 11 чаров в Ютф8. =))
Обобщая: юникод определяет "текстовый поток", и применительно к юникод можно говорить только о сравнении двух отрывков этого потока (попросту - "строк"). Строки, представляющие один и тот же текст (т.е. одни и те же последовательности одих и тех же реально сущвствующих букв реально существующих алфавитов) могут иметь различное представление в "кусках символов", и соотв-но, в октетах в выбранном представлении..
Русский язык в этом плане - легкий язык и прятный. Или почти такой. Французский или немецкий много хуже.
strn?cmp сравнивает в вашем случае эквивалентность бинарного представления двух строк пооктетно, где аргумент задает именно число октетов (char-ов в вашем случае). Это будет работать или почти работать во многих случаях еще потому, что UTF-8 концептуально декларируется как прозрачный для кода, ориентированного на работу с однобайтными кодировками (koi8-r и др.).
Но если продолжать в том же духе, то мы быстро получим код, который или непонимает равенства "блабла" с тем "блабла" которое введет француз, или поимеете strncmp, останавливающееся на середине символкуска - скажем, ваше равенство будет выполняться всегда, если за "куку" идет любая буква русской части кодеспейса юникода, и невыполняться для других. =))))))
Чтобы остановиться: собираетесь работать с юникодом - потратьте день на:
1) гуглим пяток unicode FAQ
2) идем на юникод.орг - там нонче в открытом доступе были последние или почти-последние версии стандарта
3). идем на сайт IBM ICU - это мультиплатформенная гигантская библиотека для работы с юникод; там смотрим "для новичка" "введения" и еще какую муть, там понятно
В вышеперечисленном (вернее 1 и 3) - обращаем в частности внимание на то, почему "локали" в си и си++ - это суррогаты, более или менее пригодные для "локализованного" представления дат и валют, но совершенно непригодные для серьезной работы с языком.
Код
int main() {
char name[20], lod[30];
cin >> name;
А что произойдет, если сосчитается не 19 чаров, а больше? =)
char bif[30],d[]="взять";
cin >> bif;
if ((strncmp(bif,d,4))==0) cout << "ok";
А как надо? (я просто новичок)
Если новичок - про русский пока забыть, и про юникод тоже. См. в сторону класса std::string
А вообще - см в сторону стандартного типа wchar_t и классов std:: wstring и wcin/wcout.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
Zeus
- Сообщения: 694
Re: Кодировка
[off/2] Зря всё-таки тогда взялись башню эту дурацкую строить[off/2] 
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Кодировка
Выглядит устрашающе, да. =)
Весит устрашающе. ЦПУ требует понемножку, зато для каждой буквы.
Но кое-где это очень удобно.
А кое-где вполне хватает ASCII. =)
Ну это ладно, эта башня хотя бы понятно из-за чего такая большая и непрямая. А я вот тут собрался приводить в порядок свою кучу музыки, пошел разбираться в тэгах, сидел смотрел "стандарты" id3v2 - вот это да! Из такой простой вещи сделать такую сложную - тут явно без таланта на обошлось, я бы сказал даже отсвет чьей-то гениальности ощущаецо.
2 apacho:
Благодаря вышепомянутой прозрачности ютф8, вы вроде как спокойно можете использовать русский в
- строковых литералах (завершается однобайтным нулем, char(0) или '\', как обычно
- strlen - возвращает длину строки в байтах, а не символах, ессесно
- strcat - из двух валидных строк ютф8 соберет валидную
- strcmp - сравнение на бинарную эквивалентность - если хотя бы одна из строк приходит извне, от юзера - то строго говоря это некорректно, но для русского работать должно
- гм, strstr по идее тоже должен работать правильно... т.е. аналогично предыдущему, если точнее
ну и разумеецо их можно выводить на обычные потоки, считывать оттуда (строками, строками! до пробела или ньюлайн), и т.п.
а вот с чарами и доступ [] к элементу строки, посимвольные операции, tolower toupper и т.д. - это фиг
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
Zeus
- Сообщения: 694
Re: Кодировка
Это об чём?
Я имел ввиду Вавилонскую башню из Ветхого завета
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Кодировка
Я имел ввиду Вавилонскую башню из Ветхого завета
Это мы поняли.
Я конкретно про ее implementation от юникоде. орг
ЗЫ: Во умора: форум сжирает завершающий ноль в '\', гыгыгы.
(да, от там был, после бэкслэша)
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Кодировка
и не несёт никакой осмысленной информации
- strcmp - сравнение на бинарную эквивалентность - если хотя бы одна из строк приходит извне, от юзера - то строго говоря это некорректно, но для русского работать должно
и для русского работать не должно и некорректно. Чтобы было корректно - надо выполняться нормализацию.
- гм, strstr по идее тоже должен работать правильно... т.е. аналогично предыдущему, если точнее
если строки нормализованы, может и будет.
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Кодировка
Ну почему же? Она не сообщает число "буков" в строке, как ей полагается, зато сообщает где у строки конец и сколько байт она займет где-нибудь... =) Косвенно сие будет использоваться в том же strcat.
- strcmp - сравнение на бинарную эквивалентность - если хотя бы одна из строк приходит извне, от юзера - то строго говоря это некорректно, но для русского работать должно
и для русского работать не должно и некорректно. Чтобы было корректно - надо выполняться нормализацию.
Гм, а что в русском подлежит нормализации? й и ё? или что-то еще?
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Кодировка
sergio писал(а): ↑11.08.2007 15:41- strcmp - сравнение на бинарную эквивалентность - если хотя бы одна из строк приходит извне, от юзера - то строго говоря это некорректно, но для русского работать должно
и для русского работать не должно и некорректно. Чтобы было корректно - надо выполняться нормализацию.
Гм, а что в русском подлежит нормализации? й и ё? или что-то еще?
Ну вроде всё. Не то чтобы я был в восторге от этих наворотов, но по-хорошему это всё надо делать.
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: Кодировка
strlen и тп функции нельзя применять к юникодной строке. тк они в большем счете работают до первого байта со значением 0.
в юникоде 0 достаточно частое явление, при этом он не является концом строки.
хотя в конце всетаки стоит нолик, на до этого нолика может быть еще куча ноликов.
в юникоде 0 достаточно частое явление, при этом он не является концом строки.
хотя в конце всетаки стоит нолик, на до этого нолика может быть еще куча ноликов.
все сказанное есть имхо...
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Кодировка
d_n_k писал(а): ↑13.08.2007 10:53strlen и тп функции нельзя применять к юникодной строке. тк они в большем счете работают до первого байта со значением 0.
в юникоде 0 достаточно частое явление, при этом он не является концом строки.
хотя в конце всетаки стоит нолик, на до этого нолика может быть еще куча ноликов.
Речь в данном случае шла не про "юникодные строки", но конкретно про UTF-8.
А для него ваше утверждение неверно в принципе.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
apacho
- Сообщения: 110
- ОС: MOPSLinux 5.1
Re: Кодировка
А почемы собственно с KOI-8R не работает вот это :
int main() {
char name[20],lod[30];
cout << "Введите имя :";
cin >> name;
strcat(lod,name);
strcat(lod,"/g");
FILE *fp=fopen(lod,"w");
if (fp==0) cout << "Не существует!";
}
???
int main() {
char name[20],lod[30];
cout << "Введите имя :";
cin >> name;
strcat(lod,name);
strcat(lod,"/g");
FILE *fp=fopen(lod,"w");
if (fp==0) cout << "Не существует!";
}
???
Окошки не нужны, нужны ПИНГВИНЫ!!!
Слака рулит!!!!!!
Слака рулит!!!!!!
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: Кодировка
вы на каком языке пишите?
c или c++
не работате потому что fopen не создает каталоги вообще
c или c++
не работате потому что fopen не создает каталоги вообще
все сказанное есть имхо...
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Кодировка
Код: Выделить всё
cout << lod << endl;FILE *fp=fopen(lod,"w");
if (fp==0) cout << "Не существует!";
}
???
Вы пытаетесь открыть файл под называнием g лежащий в директории, имя которой вводите???
Добавьте указанную строку, и проверьте, что весь путь к тому месту, где вы желаете открыть/создать файл - сущствует.
На будущее еще два замечания:
- "не работает" - это не формулировка для проблемы; что значит "не работает"? лето же на дворе - экстрасенсы в отпусках... Подозреваю, что программа компилируется, но не работает. В таком случае еще не хватает ввода который она от вас получает.
- что значит "с Кои-8р" - это тоже понять проблематишно - в приведенном вами коде нигде не указано, что именно у вас в КОИ и где. Исходники в кои? Локаль кои? и то и другое в кои? Ввод идет русскими буквами, т.е. в Кои при Кои локали??
Зайдите туда: http://www.gnu.org/software/libc/manual/html_node/index.html и второй раздел Error-Reporting - для вас.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
apacho
- Сообщения: 110
- ОС: MOPSLinux 5.1
Re: Кодировка
Компилируется, пишет несуществует(файл существует). Кои в локали и в исходнике. С английским словом работает, а с русским нет.
Окошки не нужны, нужны ПИНГВИНЫ!!!
Слака рулит!!!!!!
Слака рулит!!!!!!
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Кодировка
Развлекаться с КОИ у меня охоты нету, а в ЮТФ8 локали - у меня ВАША программа не работает с русским так же, как и с ASCII, потому что в ней ошибка.
Исправил ошибку - заработало и с АСКИ и с русской директорией в ЮТФ.
Код: Выделить всё
$ cat zz-apacho.cpp
#include <iostream>
#include <cstdio>
#include <cerrno>
using namespace std;
int main() {
char name[20], lod[30];
lod[0] = '\O'; // <== это цифра ноль должна быть а не буква О, этот чертов форум нули жрет, щас пойду наябедую на него
cout << "Введите имя :";
cin >> name;
strcat(lod,name);
strcat(lod,"/g");
cout << '[' << lod << ']' << endl;
FILE *fp=fopen(lod,"w");
if (fp==0) {
cout << "Не существует!";
if (0 != errno) {
perror(0);
}
}
}У вас автоматический массив, в си они не обнуляются при размещении. Попытка тут strcat-ить что-либо - это ошибка.
Само использование strcat в первом случае так же необосновано - strcpy есть.
Продолжаете пользовать cin::operator >>(char*) - ох смотрите, привыкнете...
Зачем вам понадобился русский, да еще и в директориях - не пойму. Сперва бы с языком разобраться. Да и вообще нечего ему в именах файлов делать.
(ушел стирать "русские" директории к такой матери)
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Кодировка
...Грустно так пытаясь что-то понять из вышенаписанного, я предположил, что от функции strlen () корректной работы ждать не приходится в одном из тех случаев, когда аргумент- строка, содержащие кириллические знаки. У меня, по крайней мере, в этом случае значение, возвращаемое strlen () удваивается!
Как видите, строка "диван" и cтрока "орёл" содержат 10 и 8 символов соответственно... В связи с этим вопрос: такая работа strlen () нормальна? На каждый байт, обозначающий букву кириллицы, ещё какой-то байт объявляется... байт... объявляется... ещё...
Надеюсь на всеобщую благосклонность и долготерпение. Нигде такая ситуация не оговорена. Что ж,. угадывать, что ли...
P.S. И звините, есле не в тему, меня сюда Google перенаправил, я новую тему создавать не рискнул.
Код: Выделить всё
#include <string.h>
#include <stdio.h>
#define b "диван"
int main () {
char c []= "орёл";
char d []= "linux";
printf ("Cимвольная константа a содержит %i символа\n", strlen (a));
printf ("Cимвольная константа b содержит %i символа\n", strlen (b));
printf ("Cимвольная константа c содержит %i символа\n", strlen ©);
printf ("Cимвольная константа d содержит %i символа\n", strlen (d));
printf ("Cимвольная константа b содержит %i символа\n", sizeof (d));
return 0;
}Как видите, строка "диван" и cтрока "орёл" содержат 10 и 8 символов соответственно... В связи с этим вопрос: такая работа strlen () нормальна? На каждый байт, обозначающий букву кириллицы, ещё какой-то байт объявляется... байт... объявляется... ещё...
Надеюсь на всеобщую благосклонность и долготерпение. Нигде такая ситуация не оговорена. Что ж,. угадывать, что ли...
P.S. И звините, есле не в тему, меня сюда Google перенаправил, я новую тему создавать не рискнул.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Кодировка
promov писал(а): ↑30.10.2007 20:27...Грустно так пытаясь что-то понять из вышенаписанного, я предположил, что от функции strlen () корректной работы ждать не приходится в одном из тех случаев, когда аргумент- строка, содержащие кириллические знаки. У меня, по крайней мере, в этом случае значение, возвращаемое strlen () удваивается!
strlen возвращает длину строки в байтах. байты и символы это совершенно разные вещи.
-
sergio
- Сообщения: 436
- Статус: Интересующийся новичок
- ОС: Debian GNU/Linux 4 & 5
Re: Кодировка
promov писал(а): ↑30.10.2007 20:27...Грустно так пытаясь что-то понять из вышенаписанного, я предположил, что от функции strlen () корректной работы ждать не приходится в одном из тех случаев, когда аргумент- строка, содержащие кириллические знаки. У меня, по крайней мере, в этом случае значение, возвращаемое strlen () удваивается!
Как видите, строка "диван" и cтрока "орёл" содержат 10 и 8 символов соответственно... В связи с этим вопрос: такая работа strlen () нормальна? На каждый байт, обозначающий букву кириллицы, ещё какой-то байт объявляется... байт... объявляется... ещё...
Если строка содержит любые знаки в стандартной однобайтной кодировке - будет возвращать число чаров == число "символов". Для koi8-r или cp1251 или или или. Для ютф-8 число чаров != число сиволов != число "буков" в общем случае.
Такая работа стрлен нормальна. В ютф-8 "буквы" из кириллической части обыкновенно занимают два октета. Но теоретически могут занимать больше одного "символа".
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Кодировка
Нет.
"Стандартная библиотечная функция strlen (s) возвращает количество символов в строке, переданной ей в качестве аргумена, не считая завершающего '\'" (К & R, изддательский дом "Вильямс", Москва-Санкт-Петербург-Киев, 2007г.)
"Функция strlen () определяет длину строки в символах" (Стивен Прата, "Язык программирования С. Лекции и упражнения, изддательский дом "Вильямс", Москва-Санкт-Петербург-Киев, 2006г.)
"size_t strlen (s) Возвращает максимальное количество символов в строке s, исключая нулевой символ" (Стефан Кочан, "Программирование на языке С, изддательский дом "Вильямс", Москва-Санкт-Петербург-Киев, 2007г.)
Извините, что таким образом возражаю ВАМ. Надо так.
А теперь к делу. На каждый кириллический символ де-факто ещё какой-то один символ появляется.
???
Если бы их было 2- и то как-то объяснить можно было-бы: один символ переводит всё это на английския язык, другой снова на русский (глупо, конечно, но какой я, такие и предположения). А один-то почему?
И: как узнать, какая у меня кодировка?
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: Кодировка
promov писал(а): ↑31.10.2007 07:54
Нет.
"Стандартная библиотечная функция strlen (s) возвращает количество символов в строке, переданной ей в качестве аргумена, не считая завершающего '\'" (К & R, изддательский дом "Вильямс", Москва-Санкт-Петербург-Киев, 2007г.)
"Функция strlen () определяет длину строки в символах" (Стивен Прата, "Язык программирования С. Лекции и упражнения, изддательский дом "Вильямс", Москва-Санкт-Петербург-Киев, 2006г.)
"size_t strlen (s) Возвращает максимальное количество символов в строке s, исключая нулевой символ" (Стефан Кочан, "Программирование на языке С, изддательский дом "Вильямс", Москва-Санкт-Петербург-Киев, 2007г.)
Извините, что таким образом возражаю ВАМ. Надо так.
А теперь к делу. На каждый кириллический символ де-факто ещё какой-то символ появляется.
???
И: как узнать, какая у меня кодировка?
символ в C (char) и байт - одно и то же. Символ в нашем понимании, и байт - разные вещи. Есть один небольшой частный случай - когда используются однобайтовые кодировки, вроде ASCII, KOI8R, CP-1251, и тд - в этом случае эти понятия совпадают. Но однобайтовые кодировки уже практически отмирают, сейчас популярер юникод, кодировки которого требуют несколько байт на один символ. Конкретно в вашем случае используется кодировка UTF-8, который для латинницы требует 1 байт, а для кириллицы - 2 байта. (для китайских иероглифов, насколько я помню, требуется 3 байта).
Кстати говоря, во многих современных языках байт и символ - совершенно разные вещи, и это правильно.
Если вам очень хочется работать с русским языком в многобайтных кодировках - почитайте про wchar_t, mbtowcs, и т.д., но это дело довольно запутанное. Если не хочется пока с этим связываться - либо настройте свою локаль на однобайтовую кодировку, либо не используйте кириллицу в своих программах..
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Кодировка
Cпасибо! Про байты понятно абсолютно всё! Ну, то есть понятно, почему sizeof ('ё')= 2- выделили 2 байта для этой буквы (или 16 битов). Это понятно. Но буква-то как была одной, так и осталась! Значит, strlen ('ё') должно быть одному? А оно два! strlen () ведь не количество байт возвращает, а количество символов, а символ один (ну, или должен быть один)
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?
-
promov
- Сообщения: 384
- Статус: Участник
- ОС: Debian GNU/Linux
Re: Кодировка
Кажется, что-то начинаю понимать. Коль скоро
Значит, работа strlen () заключается в том, чтобы подсчитать количество байтов и один отнять (символ конца строки). А оно удвоено!
Если так, то всё понятно!
Надеюсь быть полезен!
Значит, работа strlen () заключается в том, чтобы подсчитать количество байтов и один отнять (символ конца строки). А оно удвоено!
Если так, то всё понятно!
Надеюсь быть полезен!
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Мораль легко уразуметь: зачем на бал пришёл медведь?