portaldacalheta.pt
  • หลัก
  • การเพิ่มขึ้นของระยะไกล
  • ผู้คนและทีมงาน
  • การวางแผนและการพยากรณ์
  • การออกแบบ Ux
วิทยาศาสตร์ข้อมูลและฐานข้อมูล

คู่มือการเข้ารหัส UTF-8 ใน PHP และ MySQL



ในฐานะที่เป็น MySQL หรือ นักพัฒนา PHP เมื่อคุณก้าวพ้นขอบเขตที่สะดวกสบายของชุดอักขระภาษาอังกฤษเท่านั้นคุณจะพบว่าตัวเองเข้าไปพัวพันกับโลกแห่งการเข้ารหัส UTF-8 ที่แปลกประหลาดอย่างรวดเร็ว

รองพื้น UTF-8 ด่วน
Unicode เป็นมาตรฐานอุตสาหกรรมคอมพิวเตอร์ที่ใช้กันอย่างแพร่หลายซึ่งกำหนดการแมปที่ครอบคลุมของค่ารหัสตัวเลขเฉพาะกับอักขระในชุดอักขระที่เขียนขึ้นในปัจจุบันส่วนใหญ่เพื่อช่วยในการทำงานร่วมกันของระบบและการแลกเปลี่ยนข้อมูล

UTF-8 คือการเข้ารหัสความกว้างตัวแปรที่สามารถแทนอักขระทุกตัวในชุดอักขระ Unicode ได้รับการออกแบบมาเพื่อความเข้ากันได้แบบย้อนหลังกับ ASCII และเพื่อหลีกเลี่ยงความยุ่งยากของ endianness และเครื่องหมายลำดับไบต์ใน UTF-16 และ UTF-32 UTF-8 กลายเป็นการเข้ารหัสอักขระที่โดดเด่นสำหรับเวิลด์ไวด์เว็บซึ่งคิดเป็นมากกว่าครึ่งหนึ่งของหน้าเว็บทั้งหมด

UTF-8 เข้ารหัสอักขระแต่ละตัวโดยใช้หนึ่งถึงสี่ไบต์ อักขระ 128 ตัวแรกของ Unicode สอดคล้องกับ ASCII แบบตัวต่อตัวทำให้ข้อความ ASCII ที่ถูกต้องยังเป็นข้อความที่เข้ารหัส UTF-8 ที่ถูกต้อง ด้วยเหตุนี้ระบบที่ จำกัด การใช้ชุดอักขระภาษาอังกฤษจึงถูกหุ้มฉนวนจากความซับซ้อนที่อาจเกิดขึ้นกับ UTF-8

ตัวอย่างเช่นรหัสเลขฐานสิบหก Unicode สำหรับตัวอักษร A คือ U + 0041 ซึ่งใน UTF-8 นั้นเข้ารหัสเพียงด้วยไบต์เดียว 41 ในการเปรียบเทียบรหัสเลขฐานสิบหก Unicode สำหรับอักขระ การเข้ารหัสข้อมูลด้วยยูนิโคด UTF-8 สำหรับ PHP และ MySQL ทำให้ภาษาที่ซับซ้อนเป็นเรื่องง่ายคือ U + 233B4 ซึ่งใน UTF-8 ถูกเข้ารหัสด้วย F0 A3 8E B4 สี่ไบต์

เมื่อก่อนหน้านี้ งาน เราเริ่มพบปัญหาการเข้ารหัสข้อมูลเมื่อแสดงประวัติของศิลปินจากทั่วทุกมุมโลก ในไม่ช้าก็เห็นได้ชัดว่ามีปัญหากับข้อมูลที่จัดเก็บเนื่องจากบางครั้งข้อมูลถูกเข้ารหัสอย่างถูกต้องและบางครั้งก็ไม่เป็นเช่นนั้น



สิ่งนี้ทำให้โปรแกรมเมอร์นำแพตช์ไปใช้งานบางครั้งก็ใช้ JavaScript บางครั้งก็ใช้เมตาแท็ก HTML charset บางครั้งก็ใช้ PHP และอื่น ๆ เร็ว ๆ นี้เราพบกับรายชื่อประวัติศิลปิน 600,000 รายการที่มีข้อมูลที่เข้ารหัสสองครั้งหรือสามครั้งโดยข้อมูลจะถูกจัดเก็บในรูปแบบที่แตกต่างกันขึ้นอยู่กับว่าใครเป็นผู้ตั้งโปรแกรมคุณสมบัติหรือติดตั้งโปรแกรม รังหนูเทคนิคคลาสสิก



อันที่จริงการสำรวจปัญหาการเข้ารหัสข้อมูล UTF-8 อาจเป็นประสบการณ์ที่น่าหงุดหงิดและน่าหงุดหงิด โพสต์นี้มีตำราอาหารที่กระชับสำหรับการแก้ไขปัญหา UTF-8 เหล่านี้เมื่อทำงานกับ PHP และ MySQL โดยเฉพาะโดยอาศัยประสบการณ์จริงและบทเรียนที่ได้เรียนรู้ (และด้วยความขอบคุณในบางส่วนสำหรับข้อมูลที่ค้นพบ ที่นี่ และ ที่นี่ ระหว่างทาง).



โดยเฉพาะอย่างยิ่งเราจะกล่าวถึงสิ่งต่อไปนี้ในโพสต์นี้:



  • ม็อดที่คุณจะต้องทำกับไฟล์ php.ini ไฟล์และ โค้ด PHP .
  • ม็อดที่คุณจะต้องทำกับไฟล์ my.ini ไฟล์และอื่น ๆ ปัญหาที่เกี่ยวข้องกับ MySQL ที่ต้องระวัง (รวมถึง config mods ที่จำเป็นหากคุณใช้ สฟิงซ์ )
  • ทำอย่างไร ย้ายข้อมูลจากไฟล์ ฐานข้อมูล MySQL ก่อนหน้านี้เข้ารหัสใน latin1 เพื่อใช้การเข้ารหัส UTF-8 แทน

การเข้ารหัส PHP UTF-8 - การแก้ไขไฟล์ php.ini ของคุณ:

สิ่งแรกที่คุณต้องทำคือแก้ไข php.ini ของคุณ ไฟล์ที่จะใช้ UTF-8 เป็นชุดอักขระเริ่มต้น:

default_charset = 'utf-8';

(หมายเหตุ: คุณสามารถใช้ phpinfo() ในภายหลังเพื่อตรวจสอบว่าได้ตั้งค่าอย่างถูกต้องแล้ว)



ตกลงเจ๋งดังนั้นตอนนี้ PHP และ UTF-8 ควรทำงานร่วมกันได้ดี ขวา?

ดีไม่ว่า ในความเป็นจริงไม่ได้ปิด



แม้ว่าการเปลี่ยนแปลงนี้จะช่วยให้มั่นใจได้ว่า PHP จะแสดงผล UTF-8 เป็นการเข้ารหัสอักขระ (ในการตอบสนองของเบราว์เซอร์ส่วนหัวประเภทเนื้อหา) คุณยังคงต้องทำการแก้ไขโค้ด PHP ของคุณจำนวนมากเพื่อให้แน่ใจว่าได้ประมวลผลอย่างถูกต้องและสร้าง UTF- 8 ตัวอักษร

ที่เกี่ยวข้อง: แนวทางปฏิบัติและเคล็ดลับที่ดีที่สุดของ PHP โดยนักพัฒนา ApeeScape

การเข้ารหัส PHP UTF-8 - การแก้ไขโค้ดของคุณ:

เพื่อให้แน่ใจว่าโค้ด PHP ของคุณเล่นได้ดีในแซนด์บ็อกซ์การเข้ารหัสข้อมูล UTF-8 นี่คือสิ่งที่คุณต้องทำ:



  • ตั้งค่า UTF-8 เป็นชุดอักขระสำหรับเอาต์พุตส่วนหัวทั้งหมดด้วยโค้ด PHP ของคุณ

    กลยุทธ์การซื้อขายอัตโนมัติที่ได้ผล

    ในทุกส่วนหัวเอาต์พุตของ PHP ให้ระบุ UTF-8 เป็นการเข้ารหัส:



    header('Content-Type: text/html; charset=utf-8');
  • ระบุ UTF-8 เป็นประเภทการเข้ารหัสสำหรับ XML

    function utf8_for_xml($string) { return preg_replace('/[^x{0009}x{000a}x{000d}x{0020}-x{D7FF}x{E000}-x{FFFD}]+/u', ' ', $string); }
  • ตัดอักขระที่ไม่รองรับออกจาก XML

    เนื่องจากเอกสาร XML ไม่ยอมรับอักขระ UTF-8 ทั้งหมดคุณจึงต้องดึงอักขระดังกล่าวออกจาก XML ที่คุณสร้างขึ้น ฟังก์ชันที่มีประโยชน์สำหรับการทำสิ่งนี้ (ซึ่งฉันพบ ที่นี่ ) ดังต่อไปนี้:

    $safeString = utf8_for_xml($yourUnsafeString);

    วิธีใช้ฟังก์ชันนี้ในโค้ดของคุณมีดังนี้

    htmlspecialchars
  • ระบุ UTF-8 เป็นชุดอักขระสำหรับเนื้อหา HTML ทั้งหมด

    สำหรับเนื้อหา HTML ระบุ UTF-8 เป็นการเข้ารหัส:

    htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8')

    ในรูปแบบ HTML ระบุ UTF-8 เป็นการเข้ารหัส:

    default_charset
  • ระบุ UTF-8 เป็นการเข้ารหัสในการเรียกทั้งหมดไปที่ htmlspecialchars

    เช่น .:

    htmlentities

    *บันทึก: ณ PHP 5.6.0, mysql_set_charset ค่าถูกใช้เป็นค่าเริ่มต้น จาก PHP 5.4.0 UTF-8 เป็นค่าเริ่มต้น แต่ก่อนหน้า PHP 5.4.0 จะใช้ ISO-8859-1 เป็นค่าเริ่มต้น ดังนั้นจึงเป็นความคิดที่ดีที่จะระบุ UTF-8 อย่างชัดเจนเสมอเพื่อความปลอดภัยแม้ว่าอาร์กิวเมนต์นี้จะเป็นทางเลือกก็ตาม

    โปรดทราบว่าสำหรับ UTF-8, $link = mysql_connect('localhost', 'user', 'password'); mysql_set_charset('utf8', $link); และ mysql_set_charset สามารถใช้แทนกันได้

  • ตั้งค่า UTF-8 เป็นชุดอักขระเริ่มต้นสำหรับการเชื่อมต่อ MySQL ทั้งหมด

    ระบุ UTF-8 เป็นอักขระเริ่มต้นที่กำหนดให้ใช้เมื่อแลกเปลี่ยนข้อมูลกับฐานข้อมูล MySQL โดยใช้ mysqli::set_charset:

    เทคนิคการเอาใจใส่ลูกค้า
    $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'test'); /* check connection */ if (mysqli_connect_errno()) { printf('Connect failed: %s ', mysqli_connect_error()); exit(); } /* change character set to utf8 */ if (!$mysqli->set_charset('utf8')) { printf('Error loading character set utf8: %s ', $mysqli->error); } else { printf('Current character set: %s ', $mysqli->character_set_name()); } $mysqli->close();

    โปรดทราบว่า ณ PHP 5.5.0, strlen เลิกใช้งานแล้วและ iconv ควรใช้แทน:

    iconv_strlen
  • ใช้ฟังก์ชันการจัดการสตริงเวอร์ชันที่เข้ากันได้กับ UTF-8 เสมอ

    มีฟังก์ชัน PHP หลายอย่างที่จะล้มเหลวหรืออย่างน้อยก็ไม่ทำงานตามที่คาดไว้หากการแสดงอักขระต้องการมากกว่า 1 ไบต์ (เช่นเดียวกับ UTF-8) ตัวอย่างคือ mbstring ฟังก์ชันที่จะส่งคืนจำนวนไบต์แทนที่จะเป็นจำนวนอักขระ

    มีสองตัวเลือกสำหรับจัดการกับสิ่งนี้:

    • my.ini ฟังก์ชันที่พร้อมใช้งานโดยค่าเริ่มต้นด้วย PHP จะให้ฟังก์ชันเหล่านี้หลายเวอร์ชันที่เข้ากันได้กับหลายไบต์ (เช่น [client] default-character-set=UTF-8 [mysql] default-character-set=UTF-8 [mysqld] character-set-client-handshake = false #force encoding to uft8 character-set-server=UTF-8 collation-server=UTF-8_general_ci [mysqld_safe] default-character-set=UTF-8 ฯลฯ ) อย่างไรก็ตามโปรดจำไว้ว่าสตริงที่คุณระบุให้กับฟังก์ชันเหล่านี้จะต้องเข้ารหัสอย่างถูกต้อง

    • นอกจากนี้ยังมีไฟล์ my.ini ส่วนขยายเป็น PHP (มีข้อมูลเกี่ยวกับการเปิดใช้งานและการกำหนดค่า ที่นี่ ). ส่วนขยายนี้มีชุดฟังก์ชันที่ครอบคลุมซึ่งรองรับการเข้ารหัสหลายไบต์อย่างเหมาะสม

การเข้ารหัส MySQL UTF-8 - การแก้ไขไฟล์ my.ini ของคุณ:

ในด้าน MySQL / UTF-8 การปรับเปลี่ยนเป็น mysql> show variables like 'char%'; ไฟล์จำเป็นดังต่อไปนี้:

  • ตั้งค่าพารามิเตอร์การกำหนดค่าต่อไปนี้หลังจากแต่ละแท็กที่เกี่ยวข้อง:

    | character_set_client | UTF-8 | character_set_connection | UTF-8 | character_set_database | UTF-8 | character_set_filesystem | binary | character_set_results | UTF-8 | character_set_server | UTF-8 | character_set_system | UTF-8 | character_sets_dir | /usr/share/mysql/charsets/
  • หลังจากทำการเปลี่ยนแปลงข้างต้นกับ latin1 ของคุณ รีสตาร์ท MySQL daemon ของคุณ

  • ในการตรวจสอบว่าทุกอย่างได้รับการตั้งค่าอย่างถูกต้องให้ใช้การเข้ารหัส UTF-8 ให้ดำเนินการค้นหาต่อไปนี้:

    utf8mb4

    ผลลัพธ์ควรมีลักษณะดังนี้:

    set names UTF-8;

    หากคุณเห็น sphinx.conf ในรายการเหล่านี้โปรดตรวจสอบการกำหนดค่าของคุณอีกครั้งและตรวจสอบว่าคุณได้รีสตาร์ท mysql daemon อย่างถูกต้องแล้ว

การเข้ารหัส MySQL UTF-8 - สิ่งอื่น ๆ ที่ควรพิจารณา:

  • MySQL UTF-8 เป็นการใช้งานชุดอักขระ UTF-8 แบบเต็มบางส่วน โดยเฉพาะการเข้ารหัส MySQL UTF-8 ใช้สูงสุด 3 ไบต์ในขณะที่ 4 ไบต์จำเป็นสำหรับการเข้ารหัสชุดอักขระ UTF-8 แบบเต็ม สิ่งนี้ใช้ได้สำหรับอักขระภาษาทั้งหมด แต่ถ้าคุณต้องการรองรับสัญลักษณ์ดาว (ซึ่งมีจุดรหัสอยู่ในช่วง U + 010000 ถึง U + 10FFFF) สิ่งเหล่านี้ต้องใช้การเข้ารหัสสี่ไบต์ซึ่งไม่รองรับใน MySQL UTF-8 ใน MySQL 5.5.3 สิ่งนี้ได้รับการแก้ไขด้วยการเพิ่มการสนับสนุนสำหรับไฟล์ utf8mb4 ชุดตัวอักษร ซึ่งใช้สูงสุดสี่ไบต์ต่ออักขระและด้วยเหตุนี้จึงสนับสนุนชุดอักขระ UTF-8 แบบเต็ม ดังนั้นหากคุณใช้ MySQL 5.5.3 หรือใหม่กว่าให้ใช้ charset_type = utf-8 แทน UTF-8 เป็นชุดอักขระฐานข้อมูล / ตาราง / แถวของคุณ มีข้อมูลเพิ่มเติม ที่นี่ .

  • หากไคลเอนต์ที่เชื่อมต่อไม่มีวิธีระบุการเข้ารหัสสำหรับการสื่อสารกับ MySQL หลังจากสร้างการเชื่อมต่อแล้วคุณอาจต้องรันคำสั่ง / เคียวรีต่อไปนี้:

    sql_query_pre = SET CHARACTER_SET_RESULTS=UTF-8 sql_query_pre = SET NAMES UTF-8
  • เมื่อกำหนดขนาดของช่อง varchar เมื่อสร้างแบบจำลองฐานข้อมูลอย่าลืมว่าอักขระ UTF-8 อาจต้องการได้มากถึง 4 ไบต์ต่ออักขระ

การเข้ารหัส MySQL UTF-8 - หากคุณใช้ Sphinx:

  • ในไฟล์กำหนดค่า Sphinx ของคุณ (เช่น charset_table):

    • ตั้งค่านิยามดัชนีของคุณให้มี:

      my.ini
    • เพิ่มสิ่งต่อไปนี้ในนิยามแหล่งที่มาของคุณ:

      ALTER SCHEMA `your-db-name` DEFAULT CHARACTER SET UTF-8;
  • รีสตาร์ทเครื่องยนต์และสร้างดัชนีทั้งหมดใหม่

  • หากคุณต้องการกำหนดค่าสฟิงซ์เพื่อให้ตัวอักษรเช่น C c ĆćĈĉĊċČčเทียบเท่าสำหรับวัตถุประสงค์ในการค้นหาคุณจะต้องกำหนดค่า mysql> show variables like 'char%'; (a.k.a. character folding) ซึ่งโดยพื้นฐานแล้วเป็นการจับคู่ความเท่าเทียมกันระหว่างอักขระ มีข้อมูลเพิ่มเติม ที่นี่ .

การย้ายข้อมูลฐานข้อมูลที่เข้ารหัสใน latin1 เป็น UTF-8 แล้ว

หากคุณมีฐานข้อมูล MySQL ที่เข้ารหัสเป็นภาษาละติน 1 อยู่แล้ววิธีการแปลง latin1 เป็น UTF-8 มีดังนี้

  1. ตรวจสอบว่าคุณได้ทำการแก้ไขการตั้งค่าทั้งหมดใน mysqldump -u USERNAME -pDB_PASSWORD --opt --skip-set-charset --default-character-set=latin1 --skip-extended-insert DATABASENAME --tables TABLENAME > DUMP_FILE_TABLE.sql ของคุณแล้ว ตามที่อธิบายไว้ข้างต้น

  2. ดำเนินการคำสั่งต่อไปนี้:

    mysqldump -u root --opt --skip-set-charset --default-character-set=latin1 --skip-extended-insert artists-database --tables tbl_artist > tbl_artist.sql
  3. ผ่านบรรทัดคำสั่งตรวจสอบว่าทุกอย่างถูกตั้งค่าเป็น UTF-8 อย่างถูกต้อง

    perl -i -pe 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=UTF-8/' DUMP_FILE_TABLE.sql
  4. สร้างไฟล์ดัมพ์ด้วยการเข้ารหัส latin1 สำหรับตารางที่คุณต้องการแปลง:

    mysql> source 'DUMP_FILE_TABLE.sql';

    เช่น:

    mysql> select count(*) from MY_TABLE where LENGTH(MY_FIELD) != CHAR_LENGTH(MY_FIELD);
  5. ทำการค้นหาส่วนกลางและแทนที่ชุดอักขระในไฟล์ดัมพ์จาก latin1 เป็น UTF-8:

    c คอร์ปอเรชั่น vs s คอร์ปอเรชั่น คำนิยาม

    เช่นใช้ Perl:

    create table temptable ( select * from MY_TABLE where LENGTH(MY_FIELD) != CHAR_LENGTH(MY_FIELD));

    หมายเหตุสำหรับผู้ใช้ Windows: การเปลี่ยนสตริงชุดอักขระนี้ (จาก latin1 เป็น UTF-8) สามารถทำได้โดยใช้ find-and-replace ใน WordPad (หรือโปรแกรมแก้ไขข้อความอื่น ๆ เช่น vim) อย่าลืมบันทึกไฟล์ตามที่เป็นจริง (อย่าบันทึกเป็นไฟล์ Unicode txt!)

  6. จากจุดนี้เราจะเริ่มยุ่งกับข้อมูลฐานข้อมูลดังนั้นจึงควรระมัดระวังในการสำรองฐานข้อมูลหากคุณยังไม่ได้ดำเนินการ จากนั้นเรียกคืนการถ่ายโอนข้อมูลลงในฐานข้อมูล:

    alter table temptable modify temptable.ArtistName varchar(128) character set latin1;
  7. ค้นหาระเบียนที่อาจแปลงไม่ถูกต้องและแก้ไขให้ถูกต้อง เนื่องจากอักขระที่ไม่ใช่ ASCII เป็นอักขระหลายไบต์ตามการออกแบบเราจึงสามารถค้นหาได้โดยการเปรียบเทียบความยาวไบต์กับความยาวอักขระ (กล่าวคือเพื่อระบุแถวที่อาจมีอักขระ UTF-8 ที่เข้ารหัสสองครั้งซึ่งจำเป็นต้องได้รับการแก้ไข)

    • ดูว่ามีระเบียนที่มีอักขระแบบหลายไบต์หรือไม่ (หากข้อความค้นหานี้ส่งกลับค่าศูนย์แสดงว่าไม่มีระเบียนใด ๆ ที่มีอักขระแบบหลายไบต์ในตารางของคุณและคุณสามารถดำเนินการต่อในขั้นตอนที่ 8 ได้)

      alter table temptable modify temptable.ArtistName blob; alter table temptable modify temptable.ArtistName varchar(128) character set UTF-8;
    • คัดลอกแถวที่มีอักขระหลายไบต์ลงในตารางชั่วคราว:

      delete from MY_TABLE where LENGTH(MY_FIELD) = CHAR_LENGTH(MY_FIELD);
    • แปลงอักขระ UTF-8 ที่เข้ารหัสสองครั้งเป็นอักขระ UTF-8 ที่เหมาะสม

      นี่เป็นเรื่องยุ่งยากเล็กน้อย สตริงที่เข้ารหัสสองครั้งคือสตริงที่เข้ารหัสอย่างถูกต้องเป็น UTF-8 อย่างไรก็ตาม MySQL ทำให้เราชอบที่จะแปลงมันผิดพลาด (จากสิ่งที่มัน ความคิด เป็นภาษาละติน 1) ถึง UTF-8 อีกครั้ง เมื่อเราตั้งค่าคอลัมน์เป็นการเข้ารหัส UTF-8 การแก้ไขปัญหานี้จึงต้องใช้กระบวนการสองขั้นตอนซึ่งเรา 'หลอก' MySQL เพื่อป้องกันไม่ให้ทำสิ่งนี้ให้เรา 'ชอบ'

      วิธีเขียนข้อกำหนดซอฟต์แวร์

      ขั้นแรกเราตั้งค่าประเภทการเข้ารหัสสำหรับคอลัมน์กลับเป็น latin1 ดังนั้นจึงลบการเข้ารหัสสองครั้ง:

      เช่น .:

      replace into MY_TABLE (select * from temptable);

      หมายเหตุ: อย่าลืมใช้ประเภทฟิลด์ที่ถูกต้องสำหรับตารางของคุณ ในตัวอย่างด้านบนสำหรับตารางของเราประเภทฟิลด์ที่ถูกต้องสำหรับ 'ArtistName' คือ varchar (128) แต่ฟิลด์ในตารางของคุณอาจเป็นข้อความหรือประเภทอื่นก็ได้ อย่าลืมระบุให้ถูกต้อง!

      ปัญหาคือตอนนี้ถ้าเราตั้งค่าการเข้ารหัสคอลัมน์กลับเป็น UTF-8 MySQL จะเรียกใช้การเข้ารหัสข้อมูลแบบ latin1 ถึง UTF-8 ให้เราอีกครั้งและเราจะกลับไปที่จุดเริ่มต้น เพื่อหลีกเลี่ยงสิ่งนี้เราเปลี่ยนประเภทคอลัมน์เป็นหยดและจากนั้นเราตั้งค่าเป็น UTF-8 สิ่งนี้ใช้ประโยชน์จากข้อเท็จจริงที่ว่า MySQL จะไม่พยายามเข้ารหัสหยด ดังนั้นเราจึงสามารถ 'หลอก' การแปลงชุดอักขระ MySQL เพื่อหลีกเลี่ยงปัญหาการเข้ารหัสซ้ำซ้อน

      เช่น .:

      |_+_|

      (อีกครั้งตามที่ระบุไว้ข้างต้นอย่าลืมใช้ประเภทฟิลด์ที่ถูกต้องสำหรับตารางของคุณ)

    • ลบแถวที่มีอักขระไบต์เดียวออกจากตารางชั่วคราว:

      |_+_|
    • แทรกแถวคงที่กลับเข้าไปในตารางเดิมอีกครั้ง (ก่อนทำสิ่งนี้คุณอาจต้องการเรียกใช้การเลือกบางส่วนบนสิ่งที่อยากได้เพื่อตรวจสอบว่าดูเหมือนว่าได้รับการแก้ไขอย่างถูกต้องเช่นเดียวกับการตรวจสอบความมีสุขภาพจิต)

  8. ตรวจสอบข้อมูลที่เหลือและหากจำเป็นให้ทำซ้ำขั้นตอนในขั้นตอนที่ 7 (อาจจำเป็นเช่นหากข้อมูลถูกเข้ารหัสสามครั้ง) ข้อผิดพลาดเพิ่มเติม (ถ้ามี) อาจแก้ไขได้ง่ายที่สุดด้วยตนเอง

ซอร์สโค้ดและไฟล์ทรัพยากร

อีกสิ่งหนึ่งที่ต้องจำและตรวจสอบคือไฟล์ซอร์สโค้ดไฟล์ทรัพยากรและอื่น ๆ ทั้งหมดได้รับการบันทึกอย่างถูกต้องด้วยการเข้ารหัสข้อมูล UTF-8 มิฉะนั้นอักขระ 'พิเศษ' ในไฟล์เหล่านี้อาจไม่ได้รับการจัดการอย่างถูกต้อง

ตัวอย่างเช่นใน Netbeans คุณสามารถคลิกขวาที่โปรเจ็กต์ของคุณเลือกคุณสมบัติจากนั้นใน 'แหล่งที่มา' คุณจะพบตัวเลือกการเข้ารหัสข้อมูล (โดยปกติจะมีค่าเริ่มต้นเป็น UTF-8 แต่ก็คุ้มค่าที่จะตรวจสอบ)

หรือใน Windows Notepad ให้ใช้ตัวเลือก“ บันทึกเป็น…” ในเมนูไฟล์แล้วเลือกตัวเลือกการเข้ารหัส UTF-8 ที่ด้านล่างของกล่องโต้ตอบ (โปรดทราบว่าตัวเลือก“ Unicode” ที่ Notepad มีให้นั้นแท้จริงแล้วคือ UTF-16 ดังนั้นจึงไม่ใช่สิ่งที่คุณต้องการ)

สรุป

แม้ว่ามันจะค่อนข้างน่าเบื่อ แต่การใช้เวลาทำตามขั้นตอนเหล่านี้เพื่อจัดการปัญหาการเข้ารหัสข้อมูล MySQL และ PHP UTF-8 อย่างเป็นระบบสามารถช่วยคุณประหยัดเวลาและความเศร้าโศกได้อย่างมาก ในระยะยาววิธีการที่เป็นระเบียบประเภทนี้เหนือกว่าแนวโน้มที่พบบ่อยเกินไปเพียงแค่ทำการแพตช์ระบบต่อไป

คู่มือนี้หวังเป็นอย่างยิ่งว่าจะเน้นย้ำถึงความสำคัญของการพิจารณาคำจำกัดความของชุดอักขระเมื่อตั้งค่าสภาพแวดล้อมของโครงการตั้งแต่แรกและทำงานในสภาพแวดล้อมโครงการซอฟต์แวร์ที่อธิบายการเข้ารหัสอักขระอย่างเหมาะสมในการจัดการข้อความและสตริง

ที่เกี่ยวข้อง: ก่อนที่จะดีบัก PHP ที่ใช้งานไม่ได้โปรดดูรายการข้อผิดพลาดที่พบบ่อยที่สุด 10 ข้อที่นักพัฒนา PHP ทำ

ทำความเข้าใจพื้นฐาน

ชุดอักขระ UTF-8 คืออะไร?

UTF-8 กำหนดโดยมาตรฐาน Unicode คือการเข้ารหัสอักขระ 8 บิตที่สามารถจัดเก็บอักขระ Unicode ได้ เข้ากันได้กับ ASCII

UTF-8 ย่อมาจากอะไร?

UTF ย่อมาจาก Unicode Transformation Format ในขณะที่ส่วนต่อท้าย“ 8” หมายถึงการใช้บล็อก 8 บิตเพื่อแสดงอักขระ

จะแทรกอักขระ Unicode ใน MySQL โดยใช้ PHP ได้อย่างไร?

ในการแทรกอักขระ Unicode ใน MySQL คุณต้องสร้างตารางที่รองรับ Unicode เลือกการตั้งค่าการเข้ารหัส / การเรียงลำดับที่เหมาะสมและระบุชุดอักขระในการเชื่อมต่อ MySQL จากนั้นคุณสามารถดำเนินการต่อและใช้โค้ด PHP เพื่อแทรก Unicode ได้ตามต้องการ

คำแนะนำด้านเสียง: คู่มือฉบับย่อสำหรับการออกแบบเสียง UX

การออกแบบ Ux

คำแนะนำด้านเสียง: คู่มือฉบับย่อสำหรับการออกแบบเสียง UX
ข้อผิดพลาด C ++ ที่พบบ่อยที่สุด 10 อันดับแรกที่นักพัฒนาทำ

ข้อผิดพลาด C ++ ที่พบบ่อยที่สุด 10 อันดับแรกที่นักพัฒนาทำ

ส่วนหลัง

โพสต์ยอดนิยม
ความจริงเสมือนในอุตสาหกรรมยานยนต์
ความจริงเสมือนในอุตสาหกรรมยานยนต์
วิธีใช้ Bootstrap และสร้าง. NET Projects
วิธีใช้ Bootstrap และสร้าง. NET Projects
วิธีทำความเข้าใจและประเมินการลงทุนในกองทุนอสังหาริมทรัพย์ส่วนบุคคล
วิธีทำความเข้าใจและประเมินการลงทุนในกองทุนอสังหาริมทรัพย์ส่วนบุคคล
4 ไปวิจารณ์ภาษา
4 ไปวิจารณ์ภาษา
ข้อมูลเบื้องต้นเกี่ยวกับ Magento: การนำทางในระบบนิเวศอีคอมเมิร์ซยอดนิยม
ข้อมูลเบื้องต้นเกี่ยวกับ Magento: การนำทางในระบบนิเวศอีคอมเมิร์ซยอดนิยม
 
วีซ่า H-1B: การเดินทางของนักพัฒนา iOS จากฮอนดูรัสไปยัง Silicon Valley
วีซ่า H-1B: การเดินทางของนักพัฒนา iOS จากฮอนดูรัสไปยัง Silicon Valley
ข้อผิดพลาดทั่วไปในการสื่อสารกับลูกค้า: จะไม่ทำให้ลูกค้าของคุณผิดหวังได้อย่างไร
ข้อผิดพลาดทั่วไปในการสื่อสารกับลูกค้า: จะไม่ทำให้ลูกค้าของคุณผิดหวังได้อย่างไร
การออกแบบที่คาดหวัง: วิธีสร้างประสบการณ์ผู้ใช้ที่มีมนต์ขลัง
การออกแบบที่คาดหวัง: วิธีสร้างประสบการณ์ผู้ใช้ที่มีมนต์ขลัง
กราฟิก 3 มิติ: บทช่วยสอน WebGL
กราฟิก 3 มิติ: บทช่วยสอน WebGL
การออกแบบ VUI - Voice User Interface
การออกแบบ VUI - Voice User Interface
โพสต์ยอดนิยม
  • วิธีทำงบกระแสเงินสดจากงบดุล
  • วิธีแฮ็คบัตรเครดิตแบบเติมเงิน
  • วิธีแฮ็คพินบัตรเครดิต
  • วิธีการจ้างวิศวกรซอฟต์แวร์
  • ความไร้ประสิทธิภาพที่สร้างขึ้นโดยผู้คนที่ทำงานร่วมกันมากขึ้นเรื่อย ๆ เรียกว่า:
  • รับลูกค้าเป็นที่ปรึกษา
  • ไฟล์อ็อบเจ็กต์ c++
หมวดหมู่
  • การเพิ่มขึ้นของระยะไกล
  • ผู้คนและทีมงาน
  • การวางแผนและการพยากรณ์
  • การออกแบบ Ux
  • © 2022 | สงวนลิขสิทธิ์

    portaldacalheta.pt