Jump to content
php.lv forumi

PHP skripta izpilde Win konsolē - lamājas par UTF-8


Go to solution Solved by jurchiks,

Recommended Posts

Ir tāda debīla problēma, ka nevaru palaist dažus skriptus no konsoles uz sava dev box, jo kaut kādā dīvainā veidā Windows kaut ko maina skripta izpildē un lietas nestrādā tā, kā vajag.

Konkrēts piemērs: php skripts, kas ievelk XML failu, izparsē to un ievieto datus datubāzē.

Uz production box (Ubuntu 13.04) nekādu problēmu nav, skriptu var izpildīt konsolē manuāli, normālā kron izpilde bez aizķeršanās, izpilde caur acp arī.

Uz dev box (gan mājās, gan darbā tas pats):

no acp problēmu nav (bet tur ir lapas buferēšana un izpilde aizņem laiku, katru reizi jāgaida, kamēr izpildīsies, līdz ieraudzīs rezultātu), kron uz dev box nav, bet caur konsoli ir problēmas:

izpildot skriptu, brīdī, kad dati tiek ievietoti datubāzē, mysql lamājas par non-UTF-8 character sequences:

SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xC5 trau...' for column 'name' at row 1

Teksts, par kuru lamājas: "Kartogrāfija tūrismam. Jānis Štrauhmanis."

 

Otrs piemērs:

SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xD0 \xD0\xBE\xD0\xB1...' for column 'name' at row 1

Teksts: "Robotpolicists. Robocop. Робот-полицейский. (DVD)"

 

Pirms datu ievietošanas datubāzē noteicu esošo encoding un ielogoju to, tas ir UTF-8:

$enc = mb_detect_encoding($name, 'UTF-8,ISO-8859-1,ISO-8859-5,ISO-8859-9,ISO-8859-15', true);
\Logger::debug('1st encoding: ', $enc); // vienmēr UTF-8

if (!$enc)
{
	$enc = mb_detect_encoding($name, mb_detect_order(), true);
	\Logger::debug('2nd encoding: ', $enc); // nekad netika ielogots
}

if (!$enc)
{
	$this->logError('Failed to detect encoding for text: ' . $name);
	$enc = 'UTF-8';
}

\Logger::debug('final encoding: ', $enc);

Manā skatījumā problēma nav kodā, jo visur, izņemot win konsoli, viss strādā perfekti.

Jautājums ir - kas šo stulbo uzvedību varētu izraisīt un kā to atrisināt? Baigi traucē, ja nevar skatīties skripta output realtaimā.

Link to post
Share on other sites

Un kāpēc tu mēģini insertot šito herņu - "\xD0 \xD0\xBE\xD0\xB1...", nevis normālu UTF8 tekstu?

Kāpēc, lai nevarētu insertot to, ko grib?

 

Vienkārši imho vajag pareizi eskeipot, nevajadzētu būt nekādām problēmām.

Kur ir insertošanas kods?

Link to post
Share on other sites

Tā herņa vispār tiek atpazīta kā UTF-8 teksts, ja paņemtu acis rokās, ieraudzītu, ko es uzrakstīju. Visur citur, izņemot Windows konsoli, tas arī tiek atpazīts kā UTF-8 un nekur nav nekādu eroru. Ko man iesākt, kā izdabāt Windows konsolei?

Insertošanas kods ir šāds: http://pastebin.com/ME6vMKM7

 

$prodInsert satur PDO prepared statement ar norādītajām kolonnām, values() tiek ievietotas internal masīvā, execute() inserto (PDOStatement::execute($values)). Nekādas iekšējas datu apstrādes db abstrakcijā nav, tas arī nebūtu prātīgi.

Visi faili manā projektā ir kodēti UTF-8.

Ko tu domā ar pareizu eskeipošanu?

Edited by jurchiks
Link to post
Share on other sites
  • Solution

Ok, padebugoju skriptu tā nopietnāk, izskatās, ka preg_replace kaut ko ne tā izdara:

http://pastebin.com/67Hzehfb

Šis kods kaut ko izdara ar burtu "Š" un pirmo burtu no vārda "Робот"...

Pieliekot u modifikatoru visiem patterniem, problēmas vairs nav, vienīgi, cik atceros, man bija iemesls noņemt to, jo kaut kas strādāja nepareizi... Velns viņu zin, kas.

Cerams, ka nekas nenobruks.

Edited by jurchiks
Link to post
Share on other sites
Guest
This topic is now closed to further replies.
×
×
  • Create New...