#php #casting
#php #Кастинг
Вопрос:
Я удаляю данные из файла, из этих данных я получаю год. Когда я пытаюсь преобразовать этот год (2011) в int, я получаю странный результат (2). Вот как выглядит мой код. $ year — это значение, которое я получаю из файла.
$year_int = (int) $year;
var_dump($year); //Return string(8) "2011"
var_dump($year_int); //Return int(2)
Я ожидаю, что $year_int будет int(2011).
И почему $year строка (8) не должна быть строкой (4)?
Комментарии:
1. Также невозможно воспроизвести, код, представленный в OP, является законным.
2. На самом деле вы знаете, что странно, это var_dump($ year), говорящий string(8), это должна быть строка (4).
3. @DigitalPrecision — вы упускаете факт, о котором не упоминал OP. Вы действительно не знаете, какими были исходные данные (2011), кроме того, что OP получил из результата PHP (что на самом деле все равно неверно). Смотрите код op в действии здесь: codepad.viper-7.com/A3nVjX
4. @ChristianSciberras: На самом деле, согласно его комментариям после var_dump года, он сказал, что он просто выдает 2011 год.
5. @DigitalPrecision Ты не видел мою ссылку? Он
'2011'
также сказал…
Ответ №1:
Я считаю, что ваша строка имеет кодировку UTF16, поэтому каждый символ кодируется 16 битами или 2 байтами. PHP по-прежнему считает ее строкой ASCII, считывает 1-й байт ( 2
), затем 2-й байт (нулевой символ) и останавливается на этом.
iconv('UTF-16', 'ASCII', $year)
должно помочь
РЕДАКТИРОВАТЬ Я предположил, что строка находится в UTF16, потому что ее символы, будучи ASCII, занимали по 2 байта каждый. Ваша строка может быть в одной из азиатских двухбайтовых кодировок, но все же, скорее всего, это Unicode, и вы, вероятно, используете Windows, потому что UTF16 — это внутренняя кодировка Windows.
Вот хорошая начальная статья о Unicode: http://www.joelonsoftware.com/articles/Unicode.html
Комментарии:
1. Я собирался спросить, как вы угадали эту кодировку, затем понял, что если кодировка была UTF8, она все равно будет работать, поскольку UTF8 совместим с ASCII. Возможно, вы захотите написать официальное объяснение того, как вы пришли к своему предположению?
2. Это возвращает пустую строку. И пришлось изменить UTF16 на UTF-16, чтобы он работал.
3. @LeonidShevtsov Я уверен, что это поможет будущим читателям, спасибо.
4. iconv не работал. mb_convert_encoding сработал. И оказалось, что исходная кодировка была UTF-16LE
Ответ №2:
string(8) "2011"
— вам ничего не кажется странным в этом? Может быть, тот факт, что видны только четыре символа?
Попробуйте это:
for( $i=0; $i<strlen($year); $i ) echo ord($year[$i])." ";
Посмотрите, что это вам дает. Если бы это было правильно, он должен был напечатать «50 48 49 49».
Крис редактировать: Подумал, что я бы расширил этот ответ. Пожалуйста, посмотрите Пример здесь о том, что Колинк имел в виду под «невидимыми» символами.
Комментарии:
1. он вернул 50 0 48 0 49 0 49 0 но что это значит?
2. сработало str_replace(» 0″,»,$ year). есть ли лучший способ сделать это?
3. @chaft Формальный способ сделать это так, как советовал Леонид.
4. @ChristianSciberras Метод Леонида возвращает пустую строку.
5. @chaft Во-первых, str_replace — это краткосрочное исправление. Это будет преследовать вас, пока вы не поймете, почему это происходит. Во-вторых, пожалуйста, скажите нам, откуда изначально взялся ‘2011’. Вы ввели это в своем редакторе кода или в форме в веб-браузере? Вы сохранили это в БД? После этого мы сможем посоветовать исправление. Если вы ввели его в своем редакторе кода, убедитесь, что ваш код находится в файле с правильной кодировкой (а именно, UTF-8 или обычный ASCII).