Recoding von Daten konzeptuell getrennt.
Es gibt 4 Pfade um Daten in einen Request zu kriegen:
- Kommandozeile
- Datenbank (für gespeicherte Forms)
- QUERY_STRING (http get)
- STDIN (http post)
Der letzte Teil teilt sich noch einmal in
- x-uri-encoded query string (normales http post)
- multipart/form-data container (u.a. dateiuploads)
Alle Daten in LxOffice können über INPUT_ENCODING das encoding des Formulars
überschreiben, das ist nötig weil Javascript da sein eigenes Ding dreht.
Das führt dazu, dass alle http Quellen:
1. Normal dekodiert werden müssen
2. Später noch einmal recoded werden müssen, falls ein anderes encoding
angegeben ist.
Uploads, die mit dem encoding binary geschickt werden, dürfen dagegen garnicht
recoded werden. Deshalb wurden bisher alle multipart/form-data Daten davon
ausgenommen, was aber zu Fehlern führt, wenn ein Formular gemischte Werte über
multipart/form-data sendet. Am einfachsten zu demonstrieren im CsvImport, wenn
man 'ä' als sep_char angibt.
Dieser Patch ändert das in zwei Container, in die einsortiert wird:
- Bekanntes Encoding (wird sofort nach $::form decoded)
- Eventuell unbekanntes Encoding (wird decoded, aber in einen
Zwischencontainer sortiert, und später recoded, falls nötig)
Dadurch muss das recoding nicht mehr in-place gemacht werden.
Alles in multipart/form-data wird jetzt decodiert, ausser Dateiuploads
(erkennbar am filename Attribut) und explizit binary geflaggtes
content-transfer-encoding.
Bei kollidierendem INPUT_ENCODING und "content-type; charset" wird erst das
content-type charset dekodiert, und dann ein recode aus internem coding in das
angefragte INPUT_ENCODING gemacht.