Permalänk
Medlem

HTML/PHP och UTF-8

Hur kan jag få PHP att spara filer som UTF-8 ?

Jag har en formulär sida där jag kan skriva in saker i textrutor och sedan konverteras och sparas det i XML filer som ska vara UTF-8 för att stödja flera språk. Problemet är att texten som jag provat med (ryska) ser jättebra ut tills den blir sparad i XML filen.
Enligt Notepad++ så blir filen UTF-8 men texten som är sparad är inte längre ryska utan massa andra konstiga tecken. När jag sedan väljer att visa XML filen genom min PHP visar sida så blir det samma konstiga tecken. När jag skapar en XML fil själv i Notepad++ och sparar den som UTF-8 så visar min PHP sida den korrekt.

$xml = "<?xml version='1.0' encoding='UTF-8' ?>\n<document name='Product1' rev='1.0'>\n"; $xml = $xml.''.parse($_POST); $xml = $xml."</document>\n"; $name = $_POST['language']; $handle = fopen($tmpdir."/$name.xml", "w"); fwrite($handle, chr(239).chr(187).chr(191).utf8_encode($xml)); fclose($handle);

parse($_POST) is my own simple array to XML writer.

Visa signatur

Desktop: Ryzen 9 3950x | RTX 2060 | 16Gb RAM | 512Gb + 256Gb SSD
NAS: HP Microserver Gen8 | 8GB Ram | 3x2Tb ZFS | FreeNAS
SRV: HP ML350p Gen8 | 64GB Ram | 2x E5-2630v2 | ESXI

Permalänk
Medlem

Är texten redan i UTF8 så ska den inte åter igen konverteras till UTF8.

Jag antar att ryska vart det första språk du testat som verkligen använder andra adress rymder som standard.
Sedan lär du behöva visa din parse metod, till stor del på grund av att inga av PHP's default metoder hanterar UTF8, så alla tecken som faller utanför den första biten av rymden kan och vill när som helst bli korrupt. Du har dessa extra metoder att arbeta med istället http://php.net/manual/en/book.mbstring.php och ja det är viktigt att du enbart använder dessa och glömmer av alla andra standard metoder om du ska göra en sida som stödjer utf8.

Du kan ta bort chr(239).chr(187).chr(191) ( Byte order mark är bara onödigt )

Sedan kan du försöka kolla vilket character encoding du använder dig av med hjälp av http://php.net/manual/en/function.mb-detect-encoding.php och är det inte UTF8 conventera till UTF8. Denna metod är inte perfekt så men aja.

Sist men inte minst, har dina HTML sidor samt din webbserver rapporterat att du kör UTF8 så att din webbläsare faktiskt skickar UTF8? Om inte så här gör du då http://akrabat.com/php/utf8-php-and-mysql/ många av dessa steg behövs inte om din webbserver är konfigurerad att skicka UTF8 som character encoding.

Denna är också bra att läsa: http://www.phpwact.org/php/i18n/utf-8 T.ex. som du ser här

Citat:

utf8_encode and utf8_decode

Official documentation: utf8_encode, utf8_encode
Risk: medium
Impact: will result in corrupt UTF-8 if used incorrectly - they are used to convert only between UTF-8 and ISO-8859-1 - use on another other charset (excepting ASCII-7) would result in junk / lost characters
These functions are designed to convert between ISO-8859-1 and UTF-8 (nothing more, nothing less). In particular older versions of IE / Win98 used CP1252 (a Windows encoding similar to but not the same as ISO-8859-1). See this manual entry.

Visa signatur

Speldator: i7-8700k, 32GB DDR4, RTX2080
Server 1: SB 2500k, MZI -P67GD55, 32GB DDR3, Corsair MX 240GB SSD
Surface Pro 2017, Konsoler: Typ alla, Oculus Rift