Archief - character encoding issue

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

DeFlup

Legacy Member
Ik heb een php scriptje dat data uit een csv file moet lezen, dit is een lijntje uit de csv file:

20152,Testuser,,Test,,NL,,[email protected],,2,55,2,9,Testshop,5,,P+,

De data wordt opgehaald via file_get_contents en vervolgens gesplitst met explode op het ',' teken. Deze data wordt vervolgens in een database geïmporteerd.

Maar als ik via phpMyAdmin naar de database kijk, zie ik tussen elke letter een ? karakter staan: T�e�s�t�u�s�e�r�

Als ik deze data wil exporteren naar een nieuwe csv file, komt die er als volgt uit:
20152,Testuser,Test䈬䙅ⱒ琀攀猀琀䀀琀攀猀琀⸀戀攀Ⰰ敄慣桴潬琀攀猀琀猀栀漀瀀⸀Ⰰ੭

Ik heb al vanalle dingen geprobeerd met iconv en mb_internal_encoding enzo, maar nog geen succes gehad.

Ik heb wel gemerkt dat ik deze issue alleen heb als ik met de file werk die mij werd aangeleverd. Als ik de content van de aangeleverde file kopieer naar een nieuwe file, en deze importeer, dan krijg ik de rare karakters niet.

Zou het kunnen dat er iets van metadata / headers aan de aangeleverde file verbonden zijn die ervoor zorgen dat php de file niet correct leest? Zoja, hoe kan ik dit omzeilen/fixen?

dJeez

Legacy Member
Check eerst eens met een deftige text editor in welk formaat de CSV staat (met Notepad++ kan je dat snel checken dacht ik, ervan uitgaande dat je Windows gebruikt).

DeFlup

Legacy Member
Ik had al verschillende conversions geprobeerd tussen de verschillende character sets, maar nooit echt gezien welke character set gebruikt werd in het bestand zelf. Volgens Notepad++ gaat het om UCS-2, wat volgens mij betekent dat ik de multibyte functies van php moet gebruiken (mbstring).

Ik heb dit getest en mijn database table collation op 'ucs2_bin' gezet, zonder resultaat.

Hieronder een vereenvoudigd voorbeeldje van de code die ik momenteel gebruik:

PHP:
		mb_ereg_search_init($contents, '([^¤]*)¤');		
		$r = mb_ereg_search();
		if ($r) {
			$r = mb_ereg_search_getregs();		
			do {
				$data = mb_split('\|', $r[0]);
				$query = sprintf("INSERT INTO data_utf16 (nr, name, first_name, language, email, extra, sex, field1, field2) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', 0, 1);", mysql_escape_string($data[0]), mysql_escape_string($data[5]), mysql_escape_string($data[7]), mysql_escape_string($data[17]), mysql_escape_string($data[19]), mysql_escape_string($data[25]), mysql_escape_string($data[3]));
				
			     mysql_query($query, $this->db);				
                             
			     $r = mb_ereg_search_regs();					
			} while ($r);
			
		}

DeFlup

Legacy Member
PHP:
$contents = iconv('UTF-16', 'UTF-8', $contents);
heeft uiteindelijk gewerkt.

Bedankt voor de tip dJeez :)

dJeez

Legacy Member
DeFlup zei:
PHP:
$contents = iconv('UTF-16', 'UTF-8', $contents);
heeft uiteindelijk gewerkt.

Bedankt voor de tip dJeez :)
Da's graag gedaan, bij character encoding problemen moet je altijd eerst de encoding van de bron checken, het probleem ligt hem nl. meestal daar (naar mijn ervaring toch :p).
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan