Pass Unicode-streng til PHP shell\_exec på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et Windows-program, der kan håndtere UTF16 på input. På PHP scriptet har jeg kodning erklæret som UTF8. Hvordan kalder jeg shell\_exec eller lignende funktioner for at starte programmet og overføre parameteren uændret? Eller er det slet ikke muligt?

Bedste reference


PHP implementerer shell\_exec ved hjælp af C-standardbiblioteksfunktionen popen. Dette er en byte-orienteret funktion.


Windows C runtime fortolker byte data til stdlib funktioner som repræsenterer tekst kodet på den nuværende kode side, som standard en lokalspecifik kode side, der aldrig vil være en UTF, så desværre kan du ikke pålideligt få Unicode ned ad den pågældende sti.


Du kan prøve at køre appen med kodesiden ændret til 65001, Windows-kodesiden, der skal være UTF-8. Imidlertid er der en række stdlib-fejl, der gør arbejdet i kode side 65001 upålideligt, så chancerne er, at det ikke virker. Og hvis du kører på en webserver, er det et dicey-perspektiv, der fatter med proces-globale lokalindstillinger.


Dette er et problem med alle værktøjer, der bruger C stdlib funktioner, hvilket er næsten alle scripting sprog. Kun pålidelig måde at interagere med Unicode i args eller envvars, når du opdager, at du kører under Windows, er at bruge de native Win32 API funktioner i stedet. På PHP ser det ud til at du måske kan gøre dette ved hjælp af w32api\_invoke\_function at ringe CreateProcessW. (Haven har ikke gjort det selv, men den samme strategi virker med Python ved hjælp af ctypes.)


Alternativt kan du sende data gennem stdin/stdout-strømmen. Derefter kan du læse dem som bytes og gøre nogle Unicode-konverteringer manuelt manuelt.