Кодировки Windows & KOI8-r & UTF-8

C
На сайте с 20.02.2006
Offline
52
1615

Попробую обяъснить максимально точно :)

Есть база данных mysql - в которой в одной таблице содержаться записи разной кодировки - .т.е. одна запись в KOI8-r, другая в Юникоде, третья нормальная и т.д.

:idea: Пожалуйста, если, не сложно, подскажите как сделать так что бы при выводе на страницу всегда была одна кодировка?

Т.е. я как понимаю сначала надо выбрать из базы например столбец Title? потом определить его кодировку и перекодировать его в нормальный вид (как раз вод здесь проблема :( ну а дальше print $title; :)

Заранее всем благодарен )

A
На сайте с 05.11.2005
Offline
111
#1
Challenger:
Попробую обяъснить максимально точно :)

Есть база данных mysql - в которой в одной таблице содержаться записи разной кодировки - .т.е. одна запись в KOI8-r, другая в Юникоде, третья нормальная и т.д.

☝ Пожалуйста, если, не сложно, подскажите как сделать так что бы при выводе на страницу всегда была одна кодировка?

Т.е. я как понимаю сначала надо выбрать из базы например столбец Title? потом определить его кодировку и перекодировать его в нормальный вид (как раз вод здесь проблема :( ну а дальше print $title; :)



Заранее всем благодарен )

столбец Title?

зачем?

$dbh=DBI->connect($s_base, $s_user, $s_passwd);

а потом объявляем кодировку, которую хотим юзать, например, так:

$sql="SET NAMES \"cp1251\" ";

$sth=$dbh->prepare($sql) || die;

$sth->execute();

$sth->finish();

хотя куча таблиц и все в разных кодировках - это уже нездоровая какая-то фигня получается!!!

C
На сайте с 20.02.2006
Offline
52
#2
это уже нездоровая какая-то фигня получается!!!

В том то и дело что не здоровая :( - но от этого никуда не уйти...

Объсняю на примере...

Выборка из базы

$query = "SELECT * FROM content WHERE ";

$result = mysql_query($query);

Далее...

$row = mysql_fetch_array($result);

print "$row[title]"; - Выдает строку титле в кодировке Windows

после чего...

$row = mysql_fetch_array($result);

print "$row[title]"; - Выдает строку титле в кодировке KOI8-r

после чего...

$row = mysql_fetch_array($result);

print "$row[title]"; - Выдает строку титле в кодировке UTF-8

Т.е. каждый раз не известно в каком формате будет переменная $title... :(

По этому например функцию

iconv("UTF-8","windows-1251","$row[title]");

применять сразу нельзя т.к. не известна начальная кодировка (

Весь вопрос в том как её определить :)

Заранее большое спасибо )

dkameleon
На сайте с 09.12.2005
Offline
386
#3

Иными словами нужно определение кодировки перед отображением :)

можно пробовать по кодам символов в тексте, которые характерны только для какой-то отдельной кодировки, но это всё равно не даст стопроцентного результата.

Рекомендация: в базу сразу складывать как надо :)

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

Дизайн интерьера (http://balabukha.com/)
C
На сайте с 20.02.2006
Offline
52
#4
Рекомендация: в базу сразу складывать как надо

Хорошо :) Как складывать?

Т.к. в базу инфа попадает из многих источников (рсс каналы) - и все в разной кодировке (

Палка о двух концах :(

FView
На сайте с 03.05.2006
Offline
186
#5

источники перекодируешь в тот формат который нужен (например cp1251) - потом пихаешь в базу уже в перекодированном, нужно тебе виде ...

функций перевода из одной в другую кодировок навалом ...

C
На сайте с 20.02.2006
Offline
52
#6
функций перевода из одной в другую кодировок навалом ...

Так то да ) - но как узнать из какой кодировки надо перекодировать?

AN
На сайте с 05.06.2004
Offline
243
#7
Challenger:
Так то да ) - но как узнать из какой кодировки надо перекодировать?
Challenger:
Т.к. в базу инфа попадает из многих источников (рсс каналы) - и все в разной кодировке

Но ведь для каждого из рсс-канала кодировку можно узнать, и она каждый день не меняется ;)

Размещу ваши баннеры на посещаемых сайтах. Места еще есть! Возможен безнал. (/ru/forum/324945) Нужны копирайтеры/рерайтеры - медики. Пишите в личку. (/ru/forum/676932)
dkameleon
На сайте с 09.12.2005
Offline
386
#8
Challenger:


Т.к. в базу инфа попадает из многих источников (рсс каналы) - и все в разной кодировке (

Так и думал :)

Решение уже подсказали - для каждого канала индивидуально забить его кодировку.

X
На сайте с 05.10.2005
Offline
140
#9

Взят кусок кода из Magpie RSS парсера. Думаю, логику можно взять и для себя. Также считаю, что в базу надо класть уже в одной кодировке.


/**
* Instantiate an XML parser under PHP5
*
* PHP5 will do a fine job of detecting input encoding
* if passed an empty string as the encoding.
*
* All hail libxml2!
*
*/
function php5_create_parser($in_enc, $detect) {
// by default php5 does a fine job of detecting input encodings
if(!$detect && $in_enc) {
return xml_parser_create($in_enc);
}
else {
return xml_parser_create('');
}
}

/**
* Instaniate an XML parser under PHP4
*
* Unfortunately PHP4's support for character encodings
* and especially XML and character encodings sucks. As
* long as the documents you parse only contain characters
* from the ISO-8859-1 character set (a superset of ASCII,
* and a subset of UTF-8) you're fine. However once you
* step out of that comfy little world things get mad, bad,
* and dangerous to know.
*
* The following code is based on SJM's work with FoF
* @see http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss
*
*/
function php4_create_parser($source, $in_enc, $detect) {
if ( !$detect ) {
return array(xml_parser_create($in_enc), $source);
}

if (!$in_enc) {
if (preg_match('/<?xml.*encoding=[\'"](.*?)[\'"].*?>/m', $source, $m)) {
$in_enc = strtoupper($m[1]);
$this->source_encoding = $in_enc;
}
else {
$in_enc = 'UTF-8';
}
}

if ($this->known_encoding($in_enc)) {
return array(xml_parser_create($in_enc), $source);
}

// the dectected encoding is not one of the simple encodings PHP knows

// attempt to use the iconv extension to
// cast the XML to a known encoding
// @see http://php.net/iconv

if (function_exists('iconv')) {
$encoded_source = iconv($in_enc,'UTF-8', $source);
if ($encoded_source) {
return array(xml_parser_create('UTF-8'), $encoded_source);
}
}

// iconv didn't work, try mb_convert_encoding
// @see http://php.net/mbstring
if(function_exists('mb_convert_encoding')) {
$encoded_source = mb_convert_encoding($source, 'UTF-8', $in_enc );
if ($encoded_source) {
return array(xml_parser_create('UTF-8'), $encoded_source);
}
}

// else
$this->error("Feed is in an unsupported character encoding. ($in_enc) " .
"You may see strange artifacts, and mangled characters.",
E_USER_NOTICE);

return array(xml_parser_create(), $source);
}

function known_encoding($enc) {
$enc = strtoupper($enc);
if ( in_array($enc, $this->_KNOWN_ENCODINGS) ) {
return $enc;
}
else {
return false;
}
}
Юр. услуги для ООО,ИП,СМИ,товарные знаки, Лицензии связи (хостинг,SMS), авторское право Оффшоры,merchant account,карты

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