За последние 24 часа нас посетили 17729 программистов и 1702 робота. Сейчас ищут 980 программистов ...

Как укоротить UTF-8

Тема в разделе "Прочие вопросы по PHP", создана пользователем engager, 7 сен 2010.

  1. engager

    engager Активный пользователь

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    Строковое значение возвращается из sql-запроса в utf-8.
    Нужно взять n первых символов и отписать в респонс. Если тупо substr'ом, то есть шанс попасть на половину utf-символа, что приведет к появлению уродского вопросика в ромбике (или что у кого).
    Как этого избежать?
    Можно, конечно, отконвертить в cp1251, а потом уже сабстринг обратно в утф, но это ж лишний движняк. Не хотелось бы.
    Есть идеи? Думаю, проблема не нова)
     
  2. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Может mb_substr() ?
     
  3. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    engager
    UTF-8 - двухбайтовая кодировка, вот и режь в два раза больше байт.
    Нужно получить строку размером в 5 символов?
    Получай:

    PHP:
    1. <?php
    2.  
    3. $cut = substr("Привет, мир!", 0, 5*2);
    4.  
    5. ?>
     
  4. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Apple, вы ошибаетесь, UTF-8 ни разу не двухбайтовая. Попробуйте в своём примере отрезать 8 символов.
     
  5. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    vasa_c
    четко подловил

    Apple
    там все хитрее ...
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    блин#ь, ну ленивы* шк@льники, гугля на вас нет!
    от 1 до 4 байт. латиница укладывается в один, русская кириллица использует два байта, азиатские козяблики в 4.

    Код (Text):
    1.  
    2. UTF-8 encodes each character (code point) in 1 to 4 octets (8-bit bytes). The first 128 characters of the Unicode character set (which correspond directly to the ASCII) use a single octet with the same binary value as in ASCII.
    пользуйтесь mb_* функциями правильно и спите спокойно.
    UTF-8 не единственная несколькобайтная кодировка. чтобы всё работало правильно, надо не забывать про mb_internal_encoding()
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    artoodetoo
    +1 к блин#ь :D

    Всё верно - mb_* + mb_internal_encoding магическим образом превратит UTF-8 в самый типичный скучный string :)
     
  8. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Psih
    +1. Давно тут на форуме эта проблема была решена. Надо было просто поискать.
     
  9. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    А ничё что я вторым постом УЖЕ ответил?
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    ничё. на твой mb_* обычный ответ "не работает".
     
  11. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО