Есть большой смысл заморачиваться вокруг iconv('UTF-8', 'UTF-8', $s); ?

AnrDaemon

Продвинутый новичок
Пишу код, активно работающий с конвертацией кодировок. (Источник данных невменяемый, приходится...)
Во многих местах кода возврат (передача) значения может происходить как между классами, работающими с нативной информацией (без перекодирования), так и с внешним миром, использующим UTF-8 (соответственно, [вторым] параметром запроса указывается кодировка).
При этом смысл исполняемого кода довольно часто сводится к сентенциям типа iconv('UTF-8', 'UTF-8', $s); (или, соответственно, iconv(_STUPID_INTERNAL_ENCODING, _STUPID_INTERNAL_ENCODING, $s); ).
Попробовал погонять тесты, чтобы посмотреть, сколько реально времени iconv тратит при таком обращении, но не понял результатов... видимо, я совсем разучился тестировать.
Или я сверхоптимизацией занимаюсь?...
 

AnrDaemon

Продвинутый новичок
Шутка хорошая, только на вопрос не отвечает.
40 строк ифов подряд читаемости кода не улучшает.
 

AnrDaemon

Продвинутый новичок
Знаете, вы напрашиваетесь на внимание модератора.
Либо потрудитесь изложить свою мысль своими словами, либо не пишите ничего сюда больше.
 

С.

Продвинутый новичок
А что, умение избавиться от 40 повторений одинакового кода уже не является базовым навыком программиста?
 
  • Like
Реакции: riff

AnrDaemon

Продвинутый новичок
Если подобное избавление приводит к програебизмам - нет, не является.
Я могу навертеть обёртку с __call и вызовом свойств по индексу, но понятности и прозрачности это коду не прибавляет никак.
 

С.

Продвинутый новичок
Можно еще тестировать.
Можно посмотреть исходники iconv()
Можно тупо обернуть iconv() в свою функцию с if'ом.

Что из этого нам надо сделать за тебя?
 

Vuzy

Новичок
AnrDaemon, у меня как то был скрипт который из ХМЛ файла на другом серве получал строчки в кодировке ЮТФ-8. Так вот в файле таких строчек около 15000. и все успешно перекодировались в ср1251 и внеслись в базу в течении 30 сек. сколько конкретно времени это заняло точно не скажу. так что ICONV() мало влияет на скорость. А конструкция типа из UTF в UTF это плохо да.
 

Breeze

goshogun
Команда форума
Партнер клуба
кстати было бы забавно, если б iconv не проверяла бы совпадение обеих кодировок =)
но не думаю, что это так
 

Vuzy

Новичок
hell0w0rd, я не замерял время я просто говорю что уложился в ограничение. и ICONV я использховал для одной строки неоднократно.
Breeze, не проверяет. из ЮТФ В ЮТФ тебе перекодирует и всё будет таким нечитабельным что плакать хочется.
 

AnrDaemon

Продвинутый новичок
Там явно что-то тормозило
Он же сказал - с другого сервера.
кстати было бы забавно, если б iconv не проверяла бы совпадение обеих кодировок =)
но не думаю, что это так
Я третий день над этим думаю. Мой личный консенсус по результатам трёхдневных прений - не проверяет и не должен проверять.
Представь себе ситуацию - ты передаёшь в конструкцию iconv('UTF-8', 'UTF-8', 'Привет'); привет в кодировке Windows-1251.
По описанию команды, результат должен быть в кодировке вывода, либо транслитерирован, либо зафильтрован, зависит от других настроек. Но если iconv будет проверять совпадение входной и выходной кодировок... и выводить ввод без проверки... функция просто не будет работать по определению.

P.S.
Переписал тестсуит, 100 миллинов конвертаций 8-символьной строки занимает, в среднем:
из UTF-16BE в UTF-8: 1/1'428'571 секунды (0.00000070 или 7e-7с) на конвертацию, с пиком в 1/641'025с на 10к конвертаций (1.56e-6 в среднем). [1]
из UTF-8 в UTF-16BE: 1/1'470'000 секунды (0.00000068 или 6.8e-7с) на конвертацию, с пиком в 1/160'000с на 10к конвертаций (6.25e-6с в среднем - в 4 раза медленнее в худшем случае).
из UTF-16BE в UTF-16BE (iconv.internal_encoding = UTF-8): то же, что [1].
из UTF-8 в UTF-8 (iconv.internal_encoding = UTF-8): 1/1'538'461 секунды (6.5e-7с) в среднем, максимум там же, где и [1],

Строки длинее 8-10 символов пересылаются только в виде исключения, как результат работы всего скрипта, и практически всегда, реально, перекодируются.
Итог трёхдневного бреда: СПАТЬ НАДО БОЛЬШЕ, а не кодить заполночь...
 

Vuzy

Новичок
Мой личный консенсус по результатам трёхдневных прений - не проверяет и не должен проверять.
AnrDaemon, ну это и понятно я писал об этом тут:
из ЮТФ В ЮТФ тебе перекодирует и всё будет таким нечитабельным что плакать хочется.
Лично сталкивался с подобной ситуацией. не сразу понял в чем дело. НО для этого можно сравнивать приходящую кодировку и свою и соответственно кодировать и не кодировать.
 

AnrDaemon

Продвинутый новичок
Если при кодировании из UTF в UTF получается бред, вероятно, неверно указана internal_encoding.
Хотелось бы полюбопытствовать живым примером такого поведения.

Ибо у меня выходит
PHP:
#! /usr/bin/php -f
<?php

define('_String', "Приветик");
define('_8String', iconv('Windows-1251', 'UTF-8', _String));
print iconv('UTF-8', 'UTF-8', _8String);
print ini_get('iconv.internal_encoding');
Код:
$ ./xxx.php | od -t x1
0000000 d0 9f d1 80 d0 b8 d0 b2 d0 b5 d1 82 d0 b8 d0 ba
0000020 55 54 46 2d 38
0000025
(Сам файл, естественно, в 1251.)
 
Сверху