Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: Naka в Aug 01, 2019, 14:45



Титла: Какво точно означава C locale, ами 'en_US.UTF-8' и кое да ползвам.
Публикувано от: Naka в Aug 01, 2019, 14:45
Ползвам един външен PHP проект, който обаче преебава кирилицата.
Обаче ако се зададе предварително  setlocale(LC_CTYPE,'C'); се оправя.


Код
GeSHi (PHP):
  1. // setlocale(LC_CTYPE,'bg_BG.UTF-8');
  2. // setlocale(LC_CTYPE,'C');
  3. setlocale(LC_CTYPE,'en_US.UTF-8');
  4.  
  5. print  external_func('Abcdef-Абвгдж');
  6.  

резултат без зададен лоакл:
"Abcdef-А��вгд��"

резултат със зададен лоакл:
'Abcdef-Абвгдж'

Интересното е, че работи правилно и с трите локала 'bg_BG.UTF-8', 'C', 'en_US.UTF-8'
При тях работи правилно и на кирилица и даже на гръчки.
Кой локал да ползвам. 'C' какво точно означава??? разбирам че 'C' не ми гарантира utf-8, но все пак работи. Не е ли по-правилно 'en_US.UTF-8'  ???


Титла: Re: Какво точно означава C locale, ами 'en_US.UTF-8' и кое да ползвам.
Публикувано от: go_fire в Aug 01, 2019, 15:09
По принцип е приета конвенция при Ц (демек аски) за по-големите кодове да се ползва подразбиращото разширение. Демек при теб трябва да е цп1251, малко вероятно и 8859-5.


Титла: Re: Какво точно означава C locale, ами 'en_US.UTF-8' и кое да ползвам.
Публикувано от: Naka в Aug 01, 2019, 15:56
Всичко ми е на utf-8 и скриптовете и стринга 'Abcdef-Абвгдж'. Aз бягам от cp1251.

В действителност точно горният пример преебава на setlocale(LC_CTYPE,'bg_BG.cp1251'); затова се чудя кое utf-8 локале да ползвам.


Титла: Re: Какво точно означава C locale, ами 'en_US.UTF-8' и кое да ползвам.
Публикувано от: go_fire в Aug 01, 2019, 16:07
Сега виждам, че идват с две питанки на буква. Убеден ли си, че онова не идва с UTF-16???


Титла: Re: Какво точно означава C locale, ами 'en_US.UTF-8' и кое да ползвам.
Публикувано от: Naka в Aug 01, 2019, 16:24
Онова използва разни PHP стрингови функции които са locale зависими - затова се дъни....и затова се оправя.
Не използва никакви mb_xxxxx() функции както би се полагало. Също използва много pcre изрази, които също са аscii....Не са /fsdfsfsd/u с 'u' модификатор накрая.

Но на мен не ми се оправя чужд софтуер.
 


Титла: Re: Какво точно означава C locale, ами 'en_US.UTF-8' и кое да ползвам.
Публикувано от: 4096bits в Aug 01, 2019, 17:14
Баси! Мислех, че всичко вече е Unicode.


Титла: Re: Какво точно означава C locale, ами 'en_US.UTF-8' и кое да ползвам.
Публикувано от: Yasen6275 в Aug 03, 2019, 07:56
Всичко ми е на utf-8 и скриптовете и стринга 'Abcdef-Абвгдж'. Aз бягам от cp1251.

В действителност точно горният пример преебава на setlocale(LC_CTYPE,'bg_BG.cp1251'); затова се чудя кое utf-8 локале да ползвам.
bg_BG.UTF-8 например?


Титла: Re: Какво точно означава C locale, ами 'en_US.UTF-8' и кое да ползвам.
Публикувано от: Naka в Aug 03, 2019, 11:16
Всичко ми е на utf-8 и скриптовете и стринга 'Abcdef-Абвгдж'. Aз бягам от cp1251.

В действителност точно горният пример преебава на setlocale(LC_CTYPE,'bg_BG.cp1251'); затова се чудя кое utf-8 локале да ползвам.
bg_BG.UTF-8 например?

И с bg_BG.UTF-8 работи правилно. Куриозното е че с  bg_BG.UTF-8 работи правилно и с Гръцки. Например за такъв смесен стринг 'Abcdef-Абвгдж-Αανατοσ'; което ме навежда на мисълта че *.UTF-8 е важната част.

Но аз само сетвам LC_CTYPE от всичките.
 
Цитат
   Specifies the locale to use for LC_CTYPE category information. The LC_CTYPE category determines character handling rules governing the interpretation of sequences of bytes of text data characters (that is, single-byte versus multibyte characters), the classification of characters (for example, alpha, digit, and so on), and the behavior of character classes.

Интересува ме само екстракването на символите (utf8-multibyte) да е правилно, Не ме интересува сортиране, преобразуване малки и големи букви.

На едно място прочетох че C локала не винаги означавало utf8. възможно ли е C лоакла в накои системи да е алиас на 'en_US.UTF-8' а пък в други да е алиас на ASCII.....е това не го разбирам.


Титла: Re: Какво точно означава C locale, ами 'en_US.UTF-8' и кое да ползвам.
Публикувано от: go_fire в Aug 03, 2019, 11:18
Ако е така, то П4П чупи конвенция по-стара от Юникс (колкото е стар Ц). Аз не бих взел такова решение.


Титла: Re: Какво точно означава C locale, ами 'en_US.UTF-8' и кое да ползвам.
Публикувано от: Naka в Aug 06, 2019, 11:07
в дебиана имам C.UTF-8:
locale --all-locales
bg_BG.utf8
C
C.UTF-8
en_US.utf8
POSIX
root@naka:~#

Което би означавало точно това, което трябва - да разпознава правилно utf-8.

Но в Centos 6 няма C.UTF-8 има само C, което ме навежда в мисълта, че чистото С е алиас най-малкото към някое UTF-8  ???

Ако е така, то П4П чупи конвенция по-стара от Юникс

ПХП-то не чупи нищо. Повечето му стрингови функции са директно мапнати към съответните Юникс функции в системата...към glibc ...или където и да е там....затова такива PHP функции са locale зависими.