Проблема с кодировкой на сервере.

123 4
Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#11

И да, определяется как ASCII



С чего вообще возникла идея что проблема в плоскости ASCII/UTF8?

M
На сайте с 06.04.2021
Offline
26
#12
Евгений Крупченко #:
С чего вообще возникла идея что проблема в плоскости ASCII/UTF8?

Евгений, извините, я во время своих попыток-экспериментов ввёл вас в заблуждение. Там в коде мы читаем не 20, а 19 символов (но возвращаемся назад по-прежнему на 20). Т.е. всё, как было, но: $itog = fread($f, 19);
И тогда, если строка в файле: 10000000000000000 0 D1<  (в конце пробел), то выведет 0000000000000 0 D1 - то есть, без <
Вот тут я и теряю байт, и тут я и подумал, что дело в кодировке.

Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#13

И даже вот так попробовал:


Под windows сохраняю этот файл в явно UTF8 (он становится 27 байт вместо 24), закидываю по фтп.


3 лишних байта в начале видим.

php снова читает все четко, хотя и по-прежнему думает что это ASCII


И снова вопрос - причем тут кодировка вообще? Если у вас не читает в конце пробел, то дело в чем-то другом.

А может вообще вы кусок кода выдрали и в полном там где-то затесался например trim(), обрезающий тот самый пробел.

M
На сайте с 06.04.2021
Offline
26
#14
Евгений Крупченко #:
Если у вас не читает в конце пробел, то дело в чем-то другом.

Да, я его намеренно не читаю, я написал об этом в прошлом комментарии. Это я вас запутал, извините...

T7
На сайте с 19.09.2018
Offline
63
#15
Евгений Крупченко #:
И да, определяется как ASCII
Там только  ASCII символы, вот определяет его.
mikuskov #:
Вот тут я и теряю байт
А пробел есть в конце? Иногда редакторы убирают лишние пробелы и табуляции. Т.е. если файлы отличаются только последним "w" или " ", что с их размерами?
M
На сайте с 06.04.2021
Offline
26
#16
timo-71 #:
А пробел есть в конце? Иногда редакторы убирают лишние пробелы и табуляции.

Пробел есть. Размер не меняется. Думаю, дело не в редакторе.
Вообще не понимаю, что происходит.
Вот есть код:

<?php
$f = fopen(__DIR__ . "/pos.plr", "r");
fseek($f, -20, SEEK_END);
$itog = fread($f, 19);
fclose($f);
echo $itog;
?>


В нём я намеренно не читаю последний байт. И если есть строка 10000000000000000 0 D1<J (последний байт - J, но он может быть любым, как я понял), на выходе будет 0000000000000 0 D1, то есть без <
А если вместо < написать, например, z (то есть, строка будет 10000000000000000 0 D1zJ), то на выходе всё будет как надо: 0000000000000 0 D1z
Ну что это, если не чертовщина! 
А пробелы, как и всё остальное, я добавляю через fwrite.

temniy
На сайте с 15.03.2008
Offline
257
#17
Вы читаете байты, а отбросить хотите символы. Не факт, что 1 символ занимает 1 байт. Считывайте целиком и отбрасывайте ненужное через substr, например.
⭐ Лучший хостинг от 4 евро, VPS от 6 евро, VPN недорого - разные локации - любые карты - скидки до 20% - https://fornex.com/c/ffi2e3/ru/services/
M
На сайте с 06.04.2021
Offline
26
#18
temniy #:
Вы читаете байты, а отбросить хотите символы. Не факт, что 1 символ занимает 1 байт. Считывайте целиком и отбрасывайте ненужное через substr, например.

Для строки
10000000000000000 0 D1<J
попробовал
$itog = substr(fread($f, 20), -2);
На выходе - пусто...

Для строки
10000000000000000 0 D1zJ
попробовал
$itog = substr(fread($f, 20), -2);
На выходе - zJ

Не работает...

M
На сайте с 06.04.2021
Offline
26
#19
fgetc тоже возвращает пустую строку при чтении символа <
абзац...
J
На сайте с 20.02.2014
Offline
120
jkm
#20

Результат выполнения смотрите в браузере? Ну так символ "<" и следующий за ним текст браузер интерпретирует как HTML тег  <tag>.

Загляните в исходный код страницы.


123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий