Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Кодировка строк функций
 
 автор: demonow   (23.01.2012 в 21:16)   письмо автору
 
 

В какой кодировке возвращаются строки, строковых функций??(это связано с локалью)

  Ответить  
 
 автор: cheops   (23.01.2012 в 21:23)   письмо автору
 
   для: demonow   (23.01.2012 в 21:16)
 

Кодировка - это способ интерпретации, данные возвращаются в едином виде при любой кодировке - так как это набор чисел, а вот отображаются они в соответствии с кодировкой. Если же речь идет не о строковых функциях, а скажем функциях времени, где могут возвращаться имена месяцев, дни недели, то кодировка зависит от кодировки локали (это может быть и Windows-1251, и UTF-16, и UTF-8 и даже кое-где KOI8-R встречается).

  Ответить  
 
 автор: demonow   (23.01.2012 в 21:45)   письмо автору
 
   для: cheops   (23.01.2012 в 21:23)
 

У меня проблема с локалью,
echo setlocale(LC_ALL, 'ru_RU.cp1251');

echo '<br />', strftime('Число: %d, месяц: %B, день недели: %A');

echo strtolower("ЫВРОАЫ");

Сетлокейл работает и возвращает то, что нужно и вторая функция работает, а вот в нижний регистр не хочет переводить.

  Ответить  
 
 автор: cheops   (23.01.2012 в 21:52)   письмо автору
 
   для: demonow   (23.01.2012 в 21:45)
 

А вы принципиально хотите strtolower() воспользоваться? Она вообще очень капризная и мало где работает, даже у тех, у кого с локалью вроде все в порядке (она вообще изначально на английский алфавит ориентирована)... ведь можно просто написать свою функцию, которая будет заменять массив прописных букв на массив строчных - в скорости практически не потеряете.

  Ответить  
 
 автор: demonow   (23.01.2012 в 22:04)   письмо автору
 
   для: cheops   (23.01.2012 в 21:52)
 

Просто хочется розобратса под корень.
В винде она работала, а на линуксе выпендривается.
А любой текстовый редактор использует такой же принцип просмотра текста кодирвкой как и браузер??

  Ответить  
 
 автор: cheops   (23.01.2012 в 23:02)   письмо автору
 
   для: demonow   (23.01.2012 в 22:04)
 

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

  Ответить  
 
 автор: demonow   (23.01.2012 в 23:15)   письмо автору
 
   для: cheops   (23.01.2012 в 23:02)
 

Спасибо

  Ответить  
 
 автор: cheops   (23.01.2012 в 23:17)   письмо автору
 
   для: demonow   (23.01.2012 в 22:04)
 

Вы прям, как не линуксоид :))), давайте разбираться, в век интернета ман везде есть, не обязательно даже Linux иметь. setlocale() это вообще-то системный вызов, о нем много интересного можно узнать в мане, я вот чего в man setlocale вычитал (Ubuntu)
       Linux (that is, glibc) supports the portable locales "C"  and  "POSIX".
       In  the good old days there used to be support for the European Latin-1
       "ISO-8859-1" locale (e.g., in libc-4.5.21  and  libc-4.6.27),  and  the
       Russian   "KOI-8"   (more   precisely,   "koi-8r")   locale  (e.g.,  in
       libc-4.6.27),    so    that    having    an    environment     variable
       LC_CTYPE=ISO-8859-1  sufficed  to  make  isprint(3)  return  the  right
       answer.  These days non-English speaking Europeans have to work  a  bit
       harder, and must install actual locale files.
Кстати, я эти старые добрые времена отлично помню, и помню как Linux-ы шуршали под KOI8-R, потом кое-кто стал использовать UTF-8, а сейчас даже не знаю, чего там и как - надо по-новой разбираться. Но тут интересна последняя фраза, они говорят о каких-то сложностях для не-английских пользователей, что дескать новая glibc сейчас поддерживает ISO-кодировку, что вроде как нужно отдельно файлы локали устанавливать, если нужно, чтобы работало с нормальными кодировками.

Кстати попробуйте локаль выставить в кодировку ISO-8859-5 (это наша русская ISO кодировка), ну и соответственно как-то файл в ней создать - сработает или нет. Если я правильно понимаю, она должна быть у вас и с ней не должно быть проблем. Хотя может её тоже отдельно ставить. У вас раздел /etc/i18n есть? Если есть, то что там?

  Ответить  
 
 автор: demonow   (23.01.2012 в 23:24)   письмо автору
 
   для: cheops   (23.01.2012 в 23:17)
 

файл есть но там вот такая каша /etc/profile

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

if [ "$PS1" ]; then
  if [ "$BASH" ]; then
    PS1='\u@\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
    . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

umask 022

  Ответить  
 
 автор: cheops   (23.01.2012 в 23:27)   письмо автору
 
   для: demonow   (23.01.2012 в 23:24)
 

Ну это да, я уже понял, что там ничего путного нет - стер, а папка /etc/i18n есть? Вообще в /etc/ поищите при помощи find папку i18n, может она внутри других папок?

  Ответить  
 
 автор: demonow   (23.01.2012 в 23:30)   письмо автору
 
   для: cheops   (23.01.2012 в 23:27)
 

Да есть такое, там папка под название Locales есть и еще файл SUPPORTED

  Ответить  
 
 автор: cheops   (23.01.2012 в 23:36)   письмо автору
 
   для: demonow   (23.01.2012 в 23:30)
 

В Locales и должны быть локали, что там?

  Ответить  
 
 автор: demonow   (23.01.2012 в 23:40)   письмо автору
 
   для: cheops   (23.01.2012 в 23:36)
 

Там очень много файлов, в каждом примерно такое содержание, но только для разных стран.

comment_char %
escape_char /
%
% Russian Language Locale for Ukraine
% Source: RFC 2319
% Contact: Denis V. Dmitrienko
% Email: denis@denix.org
% Language: ru
% Territory: UA
% Revision: 1.2
% Date: 1998-05-03
% Application: general
% Users: general
% Charset: KOI8-U
% Distribution and use is free, also
% for commercial purposes.
и т.д. там дальше много всего написано

  Ответить  
 
 автор: cheops   (23.01.2012 в 23:45)   письмо автору
 
   для: demonow   (23.01.2012 в 23:40)
 

Как файлы называются?

>% Charset: KOI8-U
Это кодировка в которой работает данная локаль, если её установите, текст должен быть в этой кодировке.

  Ответить  
 
 автор: demonow   (23.01.2012 в 23:47)   письмо автору
 
   для: cheops   (23.01.2012 в 23:45)
 

Файл называется ru_UA

  Ответить  
 
 автор: cheops   (23.01.2012 в 23:49)   письмо автору
 
   для: demonow   (23.01.2012 в 23:47)
 

Если захотите выставить себе эту локаль, то в setlocale() вместо 'ru_RU.cp1251' нужно записать 'ru_UA.KOI8-U' и так со всеми остальными локалями, которые вы захотите задействовать (понятное дело, регистр имеет значение, кодировка тоже). UA - это понятное дело Украина, KOI8-U - это украинская кодировка.

  Ответить  
 
 автор: cheops   (23.01.2012 в 23:37)   письмо автору
 
   для: demonow   (23.01.2012 в 23:30)
 

SUPPORTED, кстати, будет не лишним почитать, там может быть ценная информация (ну, если вдруг он окажется текстовым и читаемым, что скорее всего так и есть :).

  Ответить  
 
 автор: demonow   (23.01.2012 в 23:44)   письмо автору
 
   для: cheops   (23.01.2012 в 23:37)
 

в supported просто перечислен список все локалей, но в инете я вычитал что желанные локали нужно загрузит терминалом.

  Ответить  
 
 автор: cheops   (23.01.2012 в 23:46)   письмо автору
 
   для: demonow   (23.01.2012 в 23:44)
 

Попробуйте какую-нибудь русскую загрузить, а потом выставить её в PHP.

  Ответить  
 
 автор: demonow   (23.01.2012 в 23:57)   письмо автору
 
   для: cheops   (23.01.2012 в 23:46)
 

Направления копания я понял, спасибо.Буим пробовать.

  Ответить  
 
 автор: cheops   (24.01.2012 в 00:26)   письмо автору
 
   для: demonow   (23.01.2012 в 23:57)
 

Расскажите потом, что накопали, тоже в ближайшее время Ubuntu заводить буду.

  Ответить  
 
 автор: demonow   (24.01.2012 в 00:29)   письмо автору
 
   для: cheops   (24.01.2012 в 00:26)
 

)))Я вас заразил???)))

  Ответить  
 
 автор: cheops   (24.01.2012 в 00:50)   письмо автору
 
   для: demonow   (24.01.2012 в 00:29)
 

Ну можно и так сказать :))) На самом деле мне давно надо было хороший дистрибутив с современными X-ами поставить, я имею дело только с серверами и голой консолью, что, конечно, очень полезно, но напрочь исключает программирование GUI под X-ы. Поэтому вяло разбирался в дистрибутивах, что там сейчас и как и понял, что ставить придется Ubuntu (как назло именно с этой веткой никогда дела не имел и вообще от Debian-направления всегда в стороне был). А тут стало быть время подошло, все тяну тяну, но бесконечно долго откладывать нельзя... делал тут парочку набегов, но с головой еще не окунался :)))

  Ответить  
 
 автор: demonow   (24.01.2012 в 02:47)   письмо автору
 
   для: cheops   (24.01.2012 в 00:50)
 

У меня убунту начиная с 11.04(ПК) и ноут (11.10)(и там и там работает). На более старых версиях вроде чуть по другому настраивать надо дак вот:
настраивать локали научился, тоесть при вызове функции setlocale("LC_ALL","любая локаль") все работает отлично, хотя и этот strtolower() и date() упрямо не хочет работать ну и хер с ними, зато у нас есть strftime() который прекрасно работает.
1.сначало посмотрим какие локали у нас есть на системе командой "locale -a"
2.теперь посмотрим список всех доступных локалей в том файле supported о котором мы говорили
3.Выбираем из того списка ту локаль, которая понравилась, я например выбрал uk_UA.KOI8-U потому-что ее нету изначально в списке.
4.Теперь нужно зайти в файл locale, который находится /var/lib/locales/supported.d/locale и вписать туда нашу локаль.(uk_UA.KOI8-U)
5.Теперь в терминале нужно выполнить команду sudo dpkg-reconfigure locales там оно чете побормочет и вконце возле название нашей локали напишет done
6.Надо перегрузится.

Теперь название месяцев и прочего на украинском.
Надеюсь эта инфа кому-то поможет.
Ну вот и все, будь она проклята эта локаль.)))

  Ответить  
 
 автор: demonow   (24.01.2012 в 15:37)   письмо автору
 
   для: cheops   (23.01.2012 в 21:23)
 

Но ведь кодировка, все-ровно где-то должна быть прописана в файле, даже пустом, и получается когда функция возвращает что-то строковое(те же символы в виде цифр) она интерпретируется соответственно этой кодировке??

  Ответить  
 
 автор: cheops   (24.01.2012 в 15:43)   письмо автору
 
   для: demonow   (24.01.2012 в 15:37)
 

В простом файле кодировка никак не указывается, файл просто содержит набор данных, а вот правила в соответствии с которыми данные интерпретируются называется кодировкой. Переключите эту страницу в KOI8R, в UTF-8 и будут отображаться крокозяблики - верные данные интерпретируются неверной кодировкой. Поэтому в Web кодировка указывается при помощи META-тэгов и HTTP-заголовков. В простых файлах этого нет (ну за исключением BOM в UTF-8, от которого больше проблем, чем пользы), ну и понятно специальных бинарных форматах, которые могут сообщить программе свою кодировку, если это предусмотрено самой программой.

  Ответить  
 
 автор: demonow   (24.01.2012 в 15:49)   письмо автору
 
   для: cheops   (24.01.2012 в 15:43)
 

спасибо

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования