split() данных из файла в UTF-8

becool

Новичок
split() данных из файла в UTF-8

Поискал по форуму, тем на utf-8 много но с ответом на мой вопрос не нашёл чёта...
Проблема:
Есть файл в utf-8, пытаюсь разбить по табам -> split(chr(9),$txt); split("\t",$txt)...
конечно же по acsiшным кодам не разбивается, наверное в утф таб значится под какой то хитрой закорючкой...
Вопрос:
Каким образом можно разбить текстовой файл в utf-8 кодировке по всяческим "\n" , "\t" и так далее?

p.s.
PHP:
$file='text.txt';
$f=file_get_contents($file); // utf-8 txt file
$res=split("\n",$f);
print_r($res);
php ver: 5.x.x
 

phprus

Moderator
Команда форума
becool
Всяческие "\n" , "\t" и так далее имеют в utf-8 теже коды, что и в ascii (и вообще любые символы с ascii колом меньшим 128 имеют в utf-8 такойже код). Так что тут можно использовать [m]explode[/m]. Однако если потребуется разделение по регулярному вырпжению, то придется использовать [m]preg_split[/m] и модификатор u.
 

Dovg

Продвинутый новичок
наверное в утф таб значится под какой то хитрой закорючкой
Википедия:
В Юникоде зарезервировано 1 114 112 (= 220 + 216) позиций символов, из которых сейчас используется около 90000. Первые 256 знакомест совпадают с кодовой таблицей ISO 8859-1 (Latin-1).
 

SiMM

Новичок
> конечно же по acsiшным кодам не разбивается, наверное в утф таб значится под какой то хитрой закорючкой...

Учите матчасть.
http://ru.wikipedia.org/wiki/Unicode

-~{}~ 08.02.07 16:19:

> Первые 256 знакомест совпадают с кодовой таблицей ISO 8859-1 (Latin-1).

Вы забываете о том, что символы, с кодом больше 127 - двухбайтовые.
 

becool

Новичок
это очень здорово! правда!
но тем неменее ни explode ни split не разбивают, полученные из текстового файла, сохранённого в кодировке utf-8, данные через file_get_contents()

Какбы хотелось бы получить ответ на вопрос, а не два подряд одинаковых утверждения, если можно конечно...

phprus
таблицу кодов я уже подыскал и подсмотрел, между split и explode выбираю split, оба в моё случае работают одинакого - без результата =)
попробую preg_split() c модификатором u , cпасибо

-~{}~ 08.02.07 17:39:

не, нифига...
есть тупое подозрение что в php приходит вовсе не utf-8, может он где то по дороге передекодиться? или это уже совсем бред? =)
 

Фанат

oncle terrible
Команда форума
кто мешает тебе это предположение проверить?
или ты ждёшь, что тебе на форуме дадут ответ на этот вопрос?
 

phprus

Moderator
Команда форума
becool
между split и explode выбираю split
Ну и зря, ибо split разбивает по регулярному выражнию и соответственно работает медленние explode.

есть тупое подозрение что в php ...
Ты уверен, что у тебя файл дейстивительно в utf-8?

А кроме этого в чем выражается неработоспособность твоего кода?
 

becool

Новичок
phprus придёться изменить привычки в пользу explode =)

файл точно utf-8, сохраняется либо через notepad либо через exel (winxp) c выбором кодировки.

сам php файл отдаёт заголовок с типом данных текст/хтмл и кодировокой utf-8
header("Content-Type:text/html;charset=UTF-8");

если я пытаюсь вывести содержимое файла echo($filecontent); то ie вешается, фраерфокс показывает кучу закорючек, тем неменее если брать текст из базы (mysql) в которой оный является железным utf-8, то всё работает как нужно

-~{}~ 09.02.07 16:15:

файл закачивается на сервер через форму, в html файле с форомой так же везде прописан utf-8 (и в мета и в header())
 

phprus

Moderator
Команда форума
becool
Мне кажется, что тебя файл всетаки не в утф8 кодировке. Попробуй другой редактор с поддержкой утф8. При закачивании файлы передаются как есть и не перекодируются. Их надо перекодировать самостоятельно в скрипте.
 

john.brown

просто кулибин
А в php.ini default_charset какой? Что с сетингами mbstring? И у сервера какой по дефолту?
 

becool

Новичок
у сервера (apache2) только дефолтный mimetype прописан.
Файлы сохранены стопудово в utf-8, всётаки там туча языков и все отображаются как нужно если просто просматривать.
в php_ini:
;default_charset = "iso-8859-1" (закаментин)

модуль mbstring подключен, все параметры закаментины:
[mbstring]
;mbstring.language = Japanese
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
;mbstring.encoding_translation = Off
;mbstring.detect_order = auto
;mbstring.substitute_character = none;
;mbstring.func_overload = 0
;mbstring.strict_encoding = Off

P.s.
короче говоря, придётся разобрать эту бадягу, которая приходит в скрипт, и перекодировать её в utf8 принудительно. По другому ничё в голову не приходит
 

john.brown

просто кулибин
У сервера в конфе добавь: AddDefaultCharset UTF-8

В php.ini :
default_charset = "UTF-8"

mbstring.language = NORMAL
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.encoding_translation = Off

У меня с такими конфигами все корректно обрабатывает (Apache 2.0.52, PHP 5.2)

Если, конечно, действительно у тя нету байды с кодировкой исходного текста :)
 
Сверху