යූටීඑෆ් -8 සියල්ලම


1198

මම නව සේවාදායකයක් සකසමින් සිටින අතර මගේ වෙබ් යෙදුමේ UTF-8 සම්පූර්ණයෙන්ම සහාය දීමට කැමැත්තෙමි. මම අතීතයේ දී දැනට පවතින සේවාදායකයන් මත මෙය අත්හදා බැලූ අතර සෑම විටම ISO-8859-1 වෙත ආපසු යා යුතු බව පෙනේ.

කේතීකරණ / අක්ෂර කට්ටල සැකසීමට මට අවශ්‍ය වන්නේ කොතැනින්ද? මෙය සිදු කිරීම සඳහා මට Apache, MySQL, සහ PHP වින්‍යාස කිරීමට අවශ්‍ය බව මම දනිමි - මට අනුගමනය කළ හැකි සම්මත පිරික්සුම් ලැයිස්තුවක් තිබේද, නැතිනම් නොගැලපීම් සිදු වූ විට දෝශ නිරාකරණය කළ හැකිද?

මෙය MySQL 5, PHP, 5 සහ Apache 2 ධාවනය කරන නව ලිනක්ස් සේවාදායකයක් සඳහා වේ.


9
ඔබට කළ හැකි සියලුම කේතීකරණ දෝෂ පිළිබඳ දළ විශ්ලේෂණයක් මෙන්න: sebastianviereck.de/en/…
සෙබස්තියන් වීරෙක්


PHP 7 පිළිබඳ මෑත කාලීන සාකච්ඡාවලින් පෙනී යන්නේ 2010 නිල වශයෙන් අතහැර දමා ඇති ස්ථානයේ කිසිදු වෙනසක් නොමැති බවයි ... "PHP7 සහ UTF-8" ගැන තවත් යමක් තිබේද?
පීටර් ක්‍රවුස්

මෙම ගැටළුව පොදු ය. නමුත් කෙටිමං විසඳුමක් නොමැත, ඔබට ඒ utf-8සෑම එකක් සඳහාම වෙන වෙනම සැකසීමට සිදුවේ - MySQL 5, PHP 5 හෝ Apache 2.
මනීෂ් ශ්‍රීවාස්තවා

Answers:


1022

දත්ත ගබඩා කිරීම :

  • විශේෂයෙන් සඳහන් utf8mb4ඔබගේ දත්ත සමුදාය තුළ සියලු මේස සහ පෙළ කණු මත චරිත සමූහයක්. මෙමඟින් MySQL භෞතිකව UTF-8 හි කේතනය කර ඇති අගයන් ලබා ගනී. එකතුවක් නියම කර ඇත්නම් (කිසිදු පැහැදිලි අක්ෂර කට්ටලයක් නොමැතිව) MySQL විසින් ව්‍යංගයෙන් utf8mb4කේතන ක්‍රමය භාවිතා කරන බව සලකන්න utf8mb4_*.

  • MySQL (<5.5.3) හි පැරණි අනුවාද වලදී, අවාසනාවකට ඔබට සරලවම භාවිතා කිරීමට බල කෙරෙනු ඇත utf8, එය යුනිකෝඩ් අක්ෂරවල අනු කාණ්ඩයකට පමණක් සහාය වේ. මම විහිළු කරනවා නම් හොඳයි.

දත්ත ප්‍රවේශය :

  • ඔබගේ යෙදුම් කේතයේ (උදා: PHP), ඔබ භාවිතා කරන ඕනෑම DB ප්‍රවේශ ක්‍රමයක් තුළ, ඔබට සම්බන්ධතා අක්ෂර කට්ටලය සැකසිය යුතුය utf8mb4. මේ ආකාරයෙන්, MySQL ඔබේ යෙදුමට දත්ත ලබා දෙන විට එහි ස්වදේශීය යූටීඑෆ් -8 වෙතින් කිසිදු පරිවර්තනයක් සිදු නොකරයි.

  • සමහර රියදුරන් සම්බන්ධතා අක්ෂර කට්ටලය වින්‍යාස කිරීම සඳහා තමන්ගේම යාන්ත්‍රණයක් සපයන අතර එමඟින් එහි අභ්‍යන්තර තත්වය යාවත්කාලීන වන අතර සම්බන්ධතාවය සඳහා භාවිතා කළ යුතු කේතන ක්‍රමය MySQL වෙත දන්වයි - මෙය සාමාන්‍යයෙන් වඩාත් කැමති ප්‍රවේශයයි. PHP හි:

    • ඔබ PHP ≥ 5.3.6 සමඟ PDO වියුක්ත ස්තරය භාවිතා කරන්නේ නම් , ඔබට DSNcharset හි සඳහන් කළ හැකිය :

      $dbh = new PDO('mysql:charset=utf8mb4');
    • ඔබ mysqli භාවිතා කරන්නේ නම් , ඔබට ඇමතිය හැකිය set_charset():

      $mysqli->set_charset('utf8mb4');       // object oriented style
      mysqli_set_charset($link, 'utf8mb4');  // procedural style
    • ඔබ සරල mysql සමඟ සිරවී සිටියත් PHP ≥ 5.2.3 ධාවනය කරන්නේ නම්, ඔබට ඇමතිය හැකිය mysql_set_charset.

  • සම්බන්ධතා අක්ෂර කට්ටලය සැකසීම සඳහා ධාවකයට තමන්ගේම යාන්ත්‍රණයක් ලබා නොදෙන්නේ නම්, ඔබේ යෙදුම සම්බන්ධතාවය පිළිබඳ දත්ත කේතනය කිරීම අපේක්ෂා කරන්නේ කෙසේදැයි MySQL වෙත පැවසීමට ඔබට විමසුමක් නිකුත් කිරීමට සිදුවනු ඇත : SET NAMES 'utf8mb4'.

  • ඉහත සලකා බැලීම් utf8mb4/ utf8අදාළ වේ.

ප්‍රතිදානය :

  • ඔබගේ යෙදුම වෙනත් පද්ධති වෙත පෙළ සම්ප්‍රේෂණය කරන්නේ නම්, අක්ෂර කේතීකරණය පිළිබඳව ද ඔවුන් දැනුවත් කළ යුතුය. වෙබ් යෙදුම් සමඟ, දත්ත යවන කේතීකරණය ගැන බ්‍රව්සරයට දැනුම් දිය යුතුය (HTTP ප්‍රතිචාර ශීර්ෂ හෝ HTML පාර-දත්ත හරහා ).

  • PHP හි, ඔබට default_charsetphp.ini විකල්පය භාවිතා කළ හැකිය, නැතහොත් Content-TypeMIME ශීර්ෂය ඔබ විසින්ම අතින් නිකුත් කරන්න , එය වැඩි වැඩ කොටසක් නමුත් එකම බලපෑමක් ඇති කරයි.

  • භාවිතයෙන් ප්‍රතිදානය කේතනය කරන විට json_encode(), JSON_UNESCAPED_UNICODEදෙවන පරාමිතියක් ලෙස එක් කරන්න .

ආදානය :

  • අවාසනාවකට මෙන්, ඔබ එය ගබඩා කිරීමට හෝ ඕනෑම තැනක භාවිතා කිරීමට උත්සාහ කිරීමට පෙර ලැබුණු සෑම නූලක්ම වලංගු UTF-8 බව තහවුරු කර ගත යුතුය. PHP විසින් mb_check_encoding()උපක්‍රමය කරයි, නමුත් ඔබ එය ආගමික වශයෙන් භාවිතා කළ යුතුය. අනිෂ්ට සේවාදායකයින්ට තමන්ට අවශ්‍ය ඕනෑම කේතීකරණයක් තුළ දත්ත ඉදිරිපත් කළ හැකි බැවින් ඇත්ත වශයෙන්ම මේ සඳහා කිසිදු මාර්ගයක් නොමැත, ඔබ වෙනුවෙන් මෙය විශ්වාසදායක ලෙස කිරීමට PHP ලබා ගැනීමට උපක්‍රමයක් මට හමු නොවීය.

  • වර්තමාන HTML පිරිවිතර කියවීමෙන් නවීන HTML සඳහා පහත දැක්වෙන උප උණ්ඩ අවශ්‍ය නොවේ. මගේ අවබෝධය නම් ලේඛනය සඳහා නිශ්චිතව දක්වා ඇති අක්ෂර කට්ටලය තුළ බ්‍රව්සර් වැඩ කර දත්ත ඉදිරිපත් කරනු ඇති බවයි. කෙසේ වෙතත්, ඔබ ඉලක්ක කරන්නේ පැරණි HTML (XHTML, HTML4, ආදිය) නම්, මෙම කරුණු තවමත් ප්‍රයෝජනවත් විය හැකිය:

    • HTML5 ට පෙර HTML සඳහා පමණි : බ්‍රව්සර් මගින් ඔබට එවන සියලුම දත්ත UTF-8 හි තිබිය යුතුය. අවාසනාවකට මෙන්, ඔබ මෙය විශ්වාසදායක ලෙස කළ හැකි එකම මාර්ගය නම් accept-charsetඔබගේ සියලු <form>ටැග් වලට ගුණාංගය එක් කිරීම : <form ... accept-charset="UTF-8">.
    • HTML5 ට පෙර HTML සඳහා පමණි : W3C HTML පිරිවිතරයන් සේවාදායකයා සේවය කළ ඕනෑම අක්ෂර වින්‍යාසය තුළ නැවත සේවාදායකයට ආකෘති යැවීම පැහැර හැරිය යුතු බව සඳහන් කරන බව සලකන්න, නමුත් මෙය පැහැදිලිවම නිර්දේශයක් පමණි, එබැවින් සෑම එකක් ගැනම පැහැදිලිව ප්‍රකාශ කිරීමේ අවශ්‍යතාවය <form>ටැගය.

වෙනත් කේත සලකා බැලීම් :

  • නිසැකවම, ඔබ සේවය කරන සියලුම ලිපිගොනු (PHP, HTML, JavaScript, ආදිය) වලංගු UTF-8 තුළ කේතනය කළ යුතුය.

  • ඔබ යූටීඑෆ් -8 නූලක් සකසන සෑම අවස්ථාවකම ඔබ එය ආරක්ෂිතව කරන බවට වග බලා ගත යුතුය. මෙය අවාසනාවකට මෙන් දුෂ්කර කොටසයි. ඔබට බොහෝ විට PHP හි mbstringදිගුව පුළුල් ලෙස භාවිතා කිරීමට අවශ්‍ය වනු ඇත .

  • PHP හි ඇති සංගීත මෙහෙයුම් කරන්නේ නැහැ පෙරනිමි UTF-8 ආරක්ෂිත විසින්. සාමාන්‍ය PHP නූල් මෙහෙයුම් සමඟ ඔබට ආරක්ෂිතව කළ හැකි සමහර දේවල් තිබේ (සමෝච්ඡකරණය වැනි), නමුත් බොහෝ දේ සඳහා ඔබ සමාන mbstringශ්‍රිතයක් භාවිතා කළ යුතුය .

  • ඔබ කරන්නේ කුමක්දැයි දැන ගැනීමට (කියවන්න: එය අවුල් නොකරන්න), ඔබ සැබවින්ම UTF-8 සහ එය අවම මට්ටමින් ක්‍රියා කරන්නේ කෙසේද යන්න දැන සිටිය යුතුය. ඔබ දැනගත යුතු සියල්ල ඉගෙන ගැනීමට හොඳ සම්පත් කිහිපයක් සඳහා utf8.com වෙතින් ඕනෑම සබැඳියක් බලන්න .


4
මගේ අවබෝධය නම්, ඔබ සංයුතිය utf8_ * ලෙස සඳහන් කරන්නේ නම්, එය ස්වයංක්‍රීයව utf8 ලෙසද සංකේතවත් කරයි. මෙය වැරදිද?
chazomaticus

50
මම වැරදියි: COLLATE යන්නෙන් ගම්‍ය වන්නේ චරිත කට්ටලයයි. උදා: dev.mysql.com/doc/refman/5.0/en/charset-database.html බලන්න .
chazomaticus

7
අක්ෂර කට්ටලය සැකසීම සඳහා PDO උදාහරණ එකතු කිරීම සලකා බලන්න.
ජාක්

99
MySQL අනෙක් සියල්ලන් මෙන් එකම භාෂාව කථා නොකරන බව සලකන්න. MySQL "utf8" යැයි පැවසූ විට එහි තේරුම "දෙවියන් සඳහා බයිට් තුනකට සීමා වී ඇති UTF-8 හි අමුතුම පසුගාමී ප්‍රභේදයකි, හාස්‍යජනක හේතුව කුමක්දැයි දනී". ඔබට ඇත්ත වශයෙන්ම UTF-8 අවශ්‍ය නම් ඔබ MySQL ට පැවසිය යුත්තේ ඔබට මෙම අමුතු දෙය අවශ්‍ය බවයි MySQL utf8mb4 අමතන්න කැමතියි . "WTF!" හි ඉතිරිකිරීමට කරදර නොවන්න.
ආර්. මාටින්හෝ ෆර්නැන්ඩස්

4
මෙම පිළිතුර මට බොහෝ සෙයින් උපකාරී විය, නමුත් ඩීබී විමසුම් ප්‍රති results ල නැවත අජැක්ස් හරහා ලබා දෙන විට මගේ නඩුවේදී මගේ PHP json_encode වෙත JSON_UNESCAPED_UNICODE එකතු කළ යුතු බව මට පෙනී ගියේය.
පෙටේ 87

152

Chazomaticus ගේ විශිෂ්ට පිළිතුරට එක් දෙයක් එක් කිරීමට මම කැමතියි :

මෙටා ටැගය අමතක නොකරන්න (මේ වගේ හෝ HTML4 හෝ XHTML අනුවාදය ):

<meta charset="utf-8">

එය සුළුපටු දෙයක් ලෙස පෙනේ, නමුත් IE7 මට මීට පෙර ගැටළු ඇති කර තිබේ.

මම හැම දෙයක්ම නිවැරදිව කළා; දත්ත සමුදාය, දත්ත සමුදා සම්බන්ධතාවය සහ අන්තර්ගත වර්ගයේ HTTP ශීර්ෂය යූටීඑෆ් -8 ලෙස සකසා ඇති අතර එය අනෙක් සියලුම බ්‍රව්සර්වල හොඳින් ක්‍රියාත්මක වූ නමුත් ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් තවමත් "බටහිර යුරෝපීය" කේතන ක්‍රමය භාවිතා කිරීමට බල කර සිටියේය.

පිටුවට මෙටා ටැගය නොමැති බව පෙනී ගියේය. එය එකතු කිරීමෙන් ගැටළුව විසඳුණි.

සංස්කරණය කරන්න:

W3C ඇත්ත වශයෙන්ම I18N සඳහා වෙන් කර ඇති තරමක් විශාල කොටසක් ඇත . මෙම ගැටලුවට අදාළ ලිපි ගණනාවක් ඔවුන් සතුව ඇත - HTTP, (X) HTML සහ CSS පැත්ත විස්තර කරයි:

HTTP ශීර්ෂකය සහ HTML මෙටා ටැගය (හෝ XHTML XML ලෙස සේවය කරන්නේ නම් XML ප්‍රකාශනය) යන දෙකම භාවිතා කිරීමට ඔවුහු නිර්දේශ කරති.


HTTP ශීර්ෂයන්හි අක්ෂර කට්ටලය සඳහන් කිරීමට ද නොහැකි ද? බොහෝ විට වෙබ් සේවාදායකය සඳහා යම් වින්‍යාස විකල්පයක් අවශ්‍ය වේ ...
ඔලිවර්

2
@oliver: ඔව් ඔබට එය HTTP ශීර්ෂයෙන් යැවිය හැක, නමුත් එය අන්තර්ගතයට යැවීම වඩා හොඳය, මන්ද සේවාදායකයා ගොනුව සුරකිනවා නම්, එය සැමවිටම මෙටා ටැගය සුරකිනු ඇත. සුරකින ලද ගොනුවේ මෙටා ටැගයකට පිටපත් කිරීමට බ්‍රව්සරය දක්ෂ නම් මිස HTTP ශීර්ෂයක් අතුරුදහන් වීමට ඉඩ ඇත.

5
තවද, රේඛාව හිස මූලද්‍රව්‍යයේ පළමු දරුවා බව සහතික කරගන්න (ඕනෑම යුනිකෝඩ් දේවල් වලට පෙර). ඉහත විස්තර කර ඇති මෙටා මූලද්‍රව්‍යයට පහර දීමෙන් පසු බ්‍රව්සරය පිටුව නැවත අර්ථ දැක්විය හැකිය.
alex

65

default_charsetPhp.ini හි සැකසීමට අමතරව header(), ඕනෑම නිමැවුමකට පෙර ඔබේ කේතය තුළ සිට නිවැරදි අක්ෂර කට්ටලය යැවිය හැකිය :

header('Content-Type: text/html; charset=utf-8');

පීඑච්පී හි යුනිකෝඩ් සමඟ වැඩ කිරීම පහසු වන අතර බොහෝ නූල් ශ්‍රිත යුනිකෝඩ් සමඟ ක්‍රියා නොකරන බව ඔබ තේරුම් ගන්නා තාක් කල් , සමහරු නූල් මුළුමනින්ම අඹරනු ඇත . PHP "අක්ෂර" දිග බයිට් 1 ක් ලෙස සලකයි. සමහර විට මෙය කමක් නැත (නිදසුනක් ලෙස, explode()බයිට් අනුක්‍රමයක් පමණක් සොයන අතර එය බෙදුම්කරුවෙකු ලෙස භාවිතා කරයි - එබැවින් ඔබ සොයන සැබෑ චරිත මොනවාද යන්න ගැටළුවක් නොවේ). නමුත් වෙනත් වේලාවක, ශ්‍රිතය සැබවින්ම අක්ෂර මත වැඩ කිරීමට නිර්මාණය කර ඇති විට , ඔබේ පා text යට යුනිකෝඩ් සමඟ බහු බයිට් අක්ෂර ඇති බව PHP ට අවබෝධයක් නැත.

පරීක්ෂා කිරීමට හොඳ පුස්තකාලයක් වන්නේ phputf8 ය . මෙය UTF8 නූල් මත ආරක්ෂිතව වැඩ කිරීමට හැකි වන පරිදි සියලු "නරක" කාර්යයන් නැවත ලියයි. Mbstring දිගුව වැනි දිගු ඔබ වෙනුවෙන් මෙය කිරීමට උත්සාහ කරයි, නමුත් මම පුස්තකාලය භාවිතා කිරීමට කැමැත්තක් දක්වන්නේ එය වඩා අතේ ගෙන යා හැකි බැවිනි (නමුත් මම මහා වෙළඳපල නිෂ්පාදන ලියමි, එබැවින් එය මට වැදගත් වේ). නමුත් phputf8 හට තිරය පිටුපස mbstring භාවිතා කළ හැකිය.


Php.ini හි අධි බර සැකසුම සකසන්න. බහු බයිට් නූල් භාවිතා කරන විට එය උපකාරී වේ.
ඇන්තනි රට්ලෙජ්

33

PDO භාවිතා කරන කෙනෙකු සමඟ මට ගැටළුවක් හමු වූ අතර පිළිතුර වූයේ PDO සම්බන්ධතා නූල සඳහා මෙය භාවිතා කිරීමයි:

$pdo = new PDO(
    'mysql:host=mysql.example.com;dbname=example_db',
    "username",
    "password",
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

මා මෙය ලබාගත් වෙබ් අඩවිය අක්‍රීයයි, නමුත් වාසනාවකට මෙන් ගූගල් හැඹිලිය භාවිතයෙන් එය ලබා ගැනීමට මට හැකි විය.


1
මෙය තව ටිකක් සොයමින්, මෙය අවශ්‍ය වන්නේ 5.3.6 ට පෙර PHP අනුවාද සඳහා පමණි. මෙයද බලන්න: http://stackoverflow.com/a/4361485/2286722 (ඔවුන් වෙනම භාවිතා කළත් $dbh->exec("set names utf8");; මෙහි ඉදිරිපත් කර ඇති ක්‍රමයට මම කැමැත්තෙමි). Btw. PHP අත්පොතේ අදහස් දැක්වීමක් ලෙස මේ හා සමාන සටහනක් ද ඇත: php.net/manual/en/pdo.construct.php#96325 .
මාටින් කොට්සියර්


25

මගේ නඩුවේදී, මම භාවිතා කළේ mb_split, එය රීජෙක්ස් භාවිතා කරයි. එම නිසා රීජෙක්ස් කේතන ක්‍රමය utf-8 බව අතින් සහතික කර ගැනීමට මට සිදු වියmb_regex_encoding('UTF-8');

පැති සටහනක් ලෙස, mb_internal_encoding()අභ්‍යන්තර කේතන ක්‍රමය utf-8 නොවන බව ධාවනය කිරීමෙන් ද මම සොයා ගතිමි mb_internal_encoding("UTF-8");.


23

පළමුවෙන්ම ඔබ <5.3PHP හි සිටී නම් නැත. ඔබට විසඳීමට ගැටලු රාශියක් තිබේ.

යුනිකෝඩ් , ග්‍රැෆීම් , නූල් මෙහෙයුම් , ප්‍රාදේශීයකරණය සහ තවත් බොහෝ දේ සඳහා හොඳ සහයෝගයක් ඇති ඉන්ටෙල් පුස්තකාලය ගැන කිසිවෙකු සඳහන් නොකිරීම ගැන මම පුදුම වෙමි .

PHPBenelux'14 හි එලිසබෙත් ස්මිත්ගේ විනිවිදක මගින් PHP හි යුනිකෝඩ් සහාය පිළිබඳ තොරතුරු මම උපුටා දක්වන්නෙමි

INTL

හොඳ:

  • ICU පුස්තකාලය වටා එතීම
  • ප්‍රමිතිගත ස්ථාන, ස්ක්‍රිප්ටයකට පෙදෙසි සකසන්න
  • අංක හැඩතල ගැන්වීම
  • මුදල් හැඩතල ගැන්වීම
  • පණිවිඩ හැඩතල ගැන්වීම (gettext වෙනුවට)
  • දින දර්ශන, දිනයන්, කාල කලාපය සහ වේලාව
  • අක්ෂර පරිවර්තනය
  • ස්පූෆ්චෙකර්
  • සම්පත් මිටි
  • පරිවර්තකයන්
  • IDN සහාය
  • ග්‍රැෆීම්
  • එකතුව
  • අනුභව කරන්නන්

නරක:

  • Zend_multibite සඳහා සහය නොදක්වයි
  • HTTP ආදාන ප්‍රතිදාන පරිවර්තනයට සහය නොදක්වයි
  • ශ්‍රිතය අධික ලෙස පැටවීම සඳහා සහය නොදක්වයි

mb_string

  • Zend_multibyte සහය සක්‍රීය කරයි
  • කේතීකරණයේදී / පිටතට විනිවිද පෙනෙන HTTP සඳහා සහය දක්වයි
  • ස්ට්රෝටූපර් වැනි විනෝදකාමීත්වය සඳහා ආවරණ කිහිපයක් සපයයි

ICONV

  • අක්ෂර පරිවර්තනය සඳහා ප්‍රාථමික
  • නිමැවුම් ස්වාරක්ෂක හසුරුවන්නා
  • mime කේතීකරණ ක්‍රියාකාරිත්වය
  • පරිවර්තනය
  • සමහර සංගීත සහායකයින් (len, substr, strpos, strrpos)
  • ධාරා පෙරණය stream_filter_append($fp, 'convert.iconv.ISO-2022-JP/EUC-JP')

දත්ත සමුදායන්

  • mysql: වගු සහ සම්බන්ධතාවය මත අක්ෂර කට්ටලය සහ එකතුව (එකතුව නොවේ). MySQL - msqli හෝ PDO භාවිතා නොකරන්න
  • postgresql: pg_set_client_encoding
  • sqlite (3): එය යුනිකෝඩ් සහ ඉන්ටෙල් ආධාරයෙන් සම්පාදනය කර ඇති බවට වග බලා ගන්න

තවත් ගොට්චා

  • ඔබ 3 වන කොටස දිගුවක් භාවිතා නොකරන්නේ නම් ඔබට PHP සහ කවුළු සමඟ යුනිකෝඩ් ගොනු නාම භාවිතා කළ නොහැක.
  • ඔබ exec, proc_open සහ වෙනත් විධාන රේඛා ඇමතුම් භාවිතා කරන්නේ නම් ASCII හි සෑම දෙයක්ම යවන්න
  • සරල පෙළ සරල පෙළ නොවේ, ලිපිගොනු කේතන ක්‍රම ඇත
  • ඔබට අයිකොන්ව් ෆිල්ටරය සමඟ පියාසර කරන ගොනු පරිවර්තනය කළ හැකිය

විශේෂාංග එකතු කළ විට සහ වෙනත් දේ වෙනස් වුවහොත් මම මෙම පිළිතුර යාවත්කාලීන කරමි.


2
ඔව් හරි. මිස්ක්ලි සහ පීඩීඕ වලට ඔවුන්ගේ ස්වදේශීය ධාවක භාවිතා කළ හැකිය. ඔබ --with-mysqli=mysqlnd --with-pdo-mysql=mysqlndවිකල්ප සමඟ php සම්පාදනය කරන්නේ නම් ඔවුන්ට mysqlnd ධාවකය භාවිතා කළ හැකිය .
ඇලෙක්සැන්ඩර් යන්චාරුක්

15

මෙම පුදුමාකාර පිළිතුරු සඳහා මම එකතු කරන එකම දෙය වන්නේ ඔබේ ලිපිගොනු utf8 කේතන ක්‍රමයේ සුරැකීම අවධාරණය කිරීමයි, ඔබේ කේත කේතීකරණය ලෙස utf8 සැකසීම හරහා බ්‍රව්සර් මෙම දේපල පිළිගන්නා බව මම දුටුවෙමි. ඕනෑම හොඳ පෙළ සංස්කාරකයක් ඔබට මෙය පෙන්වනු ඇත, උදාහරණයක් ලෙස නොට්පෑඩ් ++ හි ගොනු එන්කෝන් කිරීම සඳහා මෙනු විකල්පයක් ඇත, එය වත්මන් කේතන ක්‍රමය ඔබට පෙන්වන අතර එය වෙනස් කිරීමට ඔබට හැකියාව ලබා දෙයි. මගේ සියලුම php ගොනු සඳහා මම BOM නොමැතිව utf8 භාවිතා කරමි.

කලකට පෙර වෙනත් අයෙකු විසින් නිර්මාණය කරන ලද php / mysql යෙදුමක් සඳහා utf8 සහය එක් කරන ලෙස යමෙකු මගෙන් ඉල්ලා සිටියේය, සියලුම ලිපිගොනු ANSI තුළ කේතනය කර ඇති බව මම දුටුවෙමි, එබැවින් මට සියලු ලිපිගොනු පරිවර්තනය කිරීමට ICONV භාවිතා කිරීමට සිදුවිය, දත්ත සමුදා වගු වෙනස් කිරීමට utf8 අක්ෂර කට්ටලය සහ utf8_general_ci කෝලේට්, සම්බන්ධතාවයෙන් පසු දත්ත සමුදාය වියුක්ත ස්තරයට 'SET NAMES utf8' එක් කරන්න (5.3.6 හෝ ඊට පෙර භාවිතා කරන්නේ නම්, ඔබ සම්බන්ධතා නූලෙහි charset = utf8 භාවිතා කළ යුතුය) සහ php multibyte භාවිතා කිරීම සඳහා නූල් කාර්යයන් වෙනස් කරන්න. නූල් ශ්‍රිත සමාන වේ.


14

strtolower()විශේෂ අක්‍ෂරයකින් පසු දත්ත කප්පාදු කරන විට භාවිතා කිරීම ගැටළු ඇති කළ හැකි බව මම මෑතකදී සොයා ගතිමි .

විසඳුම වූයේ භාවිතා කිරීමයි

mb_strtolower($string, 'UTF-8');

mb_ බහු බයිට් භාවිතා කරයි. එය තවත් අක්ෂර සඳහා සහය දක්වන නමුත් පොදුවේ ටිකක් මන්දගාමී වේ.


10

මම දැන් එම ගැටලුවටම මුහුණ දී PHP අත්පොත්වල හොඳ විසඳුමක් සොයා ගතිමි.

මම මගේ සියලුම ගොනු කේතීකරණය UTF8 ලෙස වෙනස් කර පසුව මගේ සම්බන්ධතාවයේ පෙරනිමි කේතන ක්‍රමය වෙනස් කළෙමි. මෙය සියලු ගැටලු විසඳීය.

if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
   printf("Current character set: %s\n", $mysqli->character_set_name());
}

මූලාශ්‍රය බලන්න


2
මම වැඩ කරන පිටුවක කේතීකරණ ගැටළුවක් හඳුනා ගැනීමට මම පැයක් ගත කළ අතර සාමාන්‍යයෙන් දේවල් හදුනා ගැනීමට මම ඉතා දක්ෂය. මම සෑම විටම මෙම පිටුව විමසන අතර ඔබේ පිළිතුර මට බොහෝ උපකාර විය. මගේ උඩු යටිකුරු කළා. මගේ නඩුවේදී, set_charset('utf8mb4')වැඩ නොකළ නමුත් එය >set_charset("utf8")කළ අතර එය ඇත්ත වශයෙන්ම අනෙක් පිළිතුරු වල දක්වා නැත.
ෆන්ක් හතළිස් නිනර්

පරෙස්සම් වන්න @FunkFortyNiner: set_charset("utf8")වැඩ විය හැකි නමුත්, වෙනස් හැසිරීමක් වනු ඇත (අතර වෙනස ගැන සඳහන බලන්න utf8සහ utf8mb4සහ mysql අනුවාද ඉතිහාසය). භාවිතය utf8 ඔබ වෙත තිබේ නම් පමණක් , ඔබ මොනවද කරන්නේ කියලා නම් !
මාටින් හෙනිංස්

තරු 5 විසඳුමක්, මම පෙළ ලිපිගොනු පේළියක් පේළියෙන් කියවමින් සිටියෙමි? සෑම චරිතයක් සඳහාම, මම අන්සි වෙනුවට utf8 භාවිතා කළෙමි. ස්තූතියි.
ආටෙෆ් ෆාරුක්

9

PHP හි, ඔබට බහු බයිට් ශ්‍රිත භාවිතා කිරීමට අවශ්‍ය වේ , නැතහොත් mbstring.func_overload සක්‍රිය කරන්න . ඔබට බයිට් එකකට වඩා ගත හැකි අක්ෂර තිබේ නම් ඒ ආකාරයෙන් strlen වැනි දේවල් ක්‍රියාත්මක වේ.

ඔබගේ ප්‍රතිචාරවල අක්ෂර කට්ටලය හඳුනා ගැනීමටද ඔබට අවශ්‍ය වනු ඇත. ඔබට ඉහත පරිදි AddDefaultCharset භාවිතා කළ හැකිය, නැතහොත් ශීර්ෂය ලබා දෙන PHP කේතය ලියන්න. (නැතහොත් ඔබේ HTML ලේඛනවලට META ටැගයක් එක් කළ හැකිය.)


Func_overload සැකසුම පිළිබඳ විශිෂ්ට ඉඟියක් - පවතින කේතයට අවම වෙනස් කිරීමට ඉඩ දෙයි.
සයිමන් ඊස්ට්

4
ප්‍රවේශම් වන්න - සමහර කේත ඇත්ත වශයෙන්ම සම්මත නූල් ශ්‍රිතවල එක්-බයිට්-අක්ෂර අක්ෂර ස්වභාවය මත රඳා පවතී.
ජේ.

ඉහත @ JW හි අදහස් දැක්වීමේදී සඳහන් කර ඇති ගැටළු හේතුවෙන් mbstring.func_overload විශේෂාංගය PHP 7.2 වන විට ඉවත් කර ඇති බව සැලකිල්ලට ගැනීම වැදගත්ය. එබැවින් හොඳම අවවාදය නම්: ඔව්, ඔබ අනිවාර්යයෙන්ම mbstring ශ්‍රිත භාවිතා කළ යුතුය, නමුත් සම්මත කාර්යයන් බහු බයිට් ලෙස වැඩ කිරීම සඳහා අධි බර විශේෂාංගය භාවිතා නොකරන්න.
සිම්බා

7

PHP හි යුනිකෝඩ් සහාය තවමත් විශාල අවුලකි. ISO8859 නූලක් (එය අභ්‍යන්තරව භාවිතා කරන) utf8 බවට පරිවර්තනය කිරීමේ හැකියාව ඇති අතර, එයට යුනිකෝඩ් නූල් සමඟ දේශීයව වැඩ කිරීමේ හැකියාවක් නොමැති අතර, එයින් අදහස් වන්නේ සියලුම නූල් සැකසුම් කාර්යයන් ඔබේ නූල් අබලන් හා දූෂිත කරනු ඇති බවයි. එබැවින් ඔබට නිසි utf8 සහය සඳහා වෙනම පුස්තකාලයක් භාවිතා කළ යුතුය, නැතහොත් සියලු නූල් හැසිරවීමේ කාර්යයන් ඔබ විසින්ම නැවත ලියන්න.

පහසුම කොටස වන්නේ HTTP ශීර්ෂයන්හි සහ දත්ත ගබඩාවේ අක්ෂර කට්ටලය නියම කිරීම පමණි, නමුත් ඔබේ PHP කේතය වලංගු UTF8 ප්‍රතිදානය නොකරන්නේ නම් ඒ කිසිවක් වැදගත් නොවේ. එය අසීරු කොටස වන අතර PHP ඔබට එහි කිසිදු උදව්වක් ලබා නොදේ. (මම හිතන්නේ PHP6 මෙහි නරකම දේ නිවැරදි කළ යුතු යැයි සිතමි, නමුත් එය තව ටික වේලාවකි)


7

ඔබට MySQL සේවාදායකය අක්‍ෂර කට්ටලය තීරණය කිරීමට අවශ්‍ය නම් සහ PHP සේවාදායකයකු ලෙස නොව (පැරණි හැසිරීම; වඩාත් කැමති, මගේ මතය අනුව), skip-character-set-client-handshakeඔබේ my.cnf, යටතේ [mysqld]සහ නැවත ආරම්භ කිරීමට උත්සාහ කරන්න mysql.

ඔබ UTF8 හැර වෙනත් දෙයක් භාවිතා කරන්නේ නම් මෙය කරදර ඇති කළ හැකිය.


6

ඉහළම පිළිතුර විශිෂ්ටයි. සාමාන්‍ය ඩෙබියන් / php / mysql සැකසුමකදී මට කළ යුතු දේ මෙන්න:

// storage
// debian. apparently already utf-8

// retrieval
// the mysql database was stored in utf-8, 
// but apparently php was requesting iso. this worked: 
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');

// delivery
// php.ini did not have a default charset, 
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');

// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.

// processing
// changed a few commands in php, like substr,
// to mb_substr

එපමණයි!


2

ඔබට mysql විසඳුමක් අවශ්‍ය නම්, සේවාදායක සංක්‍රමණයකින් පසුව, මගේ ව්‍යාපෘති 2 ක් සමඟ මට සමාන ගැටළු ඇති විය. බොහෝ විසඳුම් සෙවීමෙන් හා උත්සාහ කිරීමෙන් පසු මට මෙය හමු විය / මෙය ක්‍රියාත්මක වීමට පෙර කිසිවක් නැත):

mysqli_set_charset($con,"utf8");

මෙම වින්‍යාසය මගේ වින්‍යාස ගොනුවට එක් කිරීමෙන් පසුව සියල්ල හොඳින් ක්‍රියාත්මක වේ!

මම මෙම විසඳුම සොයාගත්තේ https://www.w3schools.com/PHP/func_mysqli_set_charset.asp මම html විමසුමෙන් ඇතුළත් කිරීමක් විසඳීමට බලා සිටියදී

වාසනාව!


0

සටහනක් පමණි:

ඔබ ඔබේ ලතින් නොවන චරිත ප්රශ්නය පෙන්නුම් මුහුණ දෙමින් සිටින ?????????ඔබට යම් ප්රශ්න, සහ එය මෙම කැනෝනිකල් ප්රශ්නයට යොමු වසා ගත්තා, ඔබ සෑම දෙයක්ම කළා ඔබ කරන දේ උනත් ඔබ තවමත් ලබා, ??????????සිට MySQL.

එයට බොහෝ දුරට හේතු වී ඇත්තේ ඔබ වැරදි අක්ෂර වින්‍යාසය භාවිතා කර දත්ත සමුදායට ඇතුළත් කර ඇති ඔබේ පැරණි දත්ත පරික්ෂා කර සත්‍ය වශයෙන්ම ප්‍රශ්නාර්ථ ලක්‍ෂණ බවට පරිවර්තනය කර ගබඩා කර ඇති ?බැවිනි. එයින් අදහස් වන්නේ ඔබට ඔබේ මුල් පිටපත සදහටම නැති වී ඇති අතර ඔබ කුමක් උත්සාහ කළත් ඔබට ලැබෙනු ඇත ???????.

මෙම ප්‍රශ්නයේ පිළිතුරු වලින් ඔබ ඉගෙන ගත් දේ නැවුම් දත්තයකට යෙදීමෙන් ඔබේ ගැටලුව විසඳිය හැකිය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.