Naprawa uszkodzonych danych formularza w PHP: UTF-8 i mbstring
Data publikacji:
Aktualizacja:
Artykuły > Naprawa uszkodzonych danych formularza w PHP: UTF-8 i mbstring
Stan na rok 2026 i bezpieczne użytkowanie
Wniosek: Zachowaj jedno jawne kodowanie – zwykle UTF-8 – w formularzu HTML, odpowiedzi HTTP, źródle PHP, obsłudze ciągów i połączeniu z bazą danych. Przechwyć nieprzetworzone dane wejściowe i zidentyfikuj granicę, w której bajty są nieprawidłowo dekodowane, przed zmianą ustawień globalnych.
Czego się nauczysz
- Jak odróżnić problem z wyświetlaniem od konwersji danych wejściowych lub uszkodzenia bazy danych.
- Które nagłówki i ustawienia PHP są istotne dla współczesnych aplikacji UTF-8.
- Dlaczego poniższe receptury
mbstring.internal_encodingimbstring.http_inputnie powinny być kopiowane do bieżącego wdrożenia.
Dla kogo to jest przeznaczone: Opiekunowie PHP rozwiązujący problemy z mojibake po sprawdzeniu poprawności formularza, przekierowaniach lub podróżach po bazie danych.
Pozycja na rok 2026: PHP wycofało stare dyrektywy dotyczące kodowania iconv/mbstring w PHP 5.6 na rzecz default_charset; nowoczesny kod powinien wyraźnie określać kodowanie na każdej granicy. Oryginalna konfiguracja została zachowana jedynie w celu wyjaśnienia zdarzenia historycznego.
Uwaga dotycząca bezpieczeństwa: polecenia i przykłady konfiguracji z pierwotnego artykułu nie zostały ponownie uruchomione we współczesnym środowisku produkcyjnym. Przed użyciem sprawdź wspierane wersje, kopie zapasowe, kontrolę dostępu i procedurę wycofania w oddzielnym środowisku testowym.
Oficjalne źródła pierwotne
Przegląd
Podczas przechodzenia z ekranu wprowadzania danych do ekranu potwierdzenia w PHP występował zniekształcony tekst.
Tekst jest zniekształcony podczas wprowadzania tekstu w formularzu i przechodzenia do ekranu potwierdzenia.
Z powodu błędów sprawdzania danych wejściowych podczas przechodzenia do własnego ekranu pojawia się również zniekształcony tekst.
Ponieważ serwer był dopiero co zbudowany, czułem, że czegoś brakuje w konfiguracji PHP, więc opiszę, czego się wtedy dowiedziałem.
Spis treści
1. dochodzenie (w celu ustalenia przyczyny czegoś)
W celu zbadania przyczyny problemu przeanalizowano następujące informacje.
1-1. ankieta
Najpierw należy sprawdzić ustawienia PHP (php.ini).
default_charset = "UTF-8"
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On
Jest on zgodny z opisem powyżej i wydaje się być w porządku.
Wtedy problem wydaje się być spowodowany przez źródło PHP.
Źródło PZP nie określiło jednak prawdopodobnego problemu.
Po raz kolejny sprawdziłem php.ini pod kątem podejrzanych ustawień i znalazłem jedno podejrzane ustawienie.
mbstring.http_input = auto
Nie było jasne, czy jest on zakodowany w UTF-8, ponieważ był ustawiony na auto, więc aby go wypróbować, zmieniono go w następujący sposób.
mbstring.http_input = UTF-8
Udało się rozwiązać problem zniekształconego tekstu.
To ustawienie jest konieczne dla modułu mbstring, gdy w PHP używa się wielobajtowych łańcuchów, takich jak japoński.
Konfiguracja kodowania otrzymywanych żądań http.
2. streszczenie
W przypadku wystąpienia zniekształconego tekstu należy najpierw spróbować zorganizować przepływ przetwarzania.
Jeśli podczas używania PHP do przechodzenia z ekranu wprowadzania do ekranu potwierdzania lub innych przejść między ekranami występują zniekształcone znaki, należy sprawdzić następujące ustawienia w pliku php.ini.
Domyślnym ustawieniem jest "auto", więc należy je sprawdzić, gdy używamy mbstring do przetwarzania ciągów wielobajtowych.