PHP: แปลงสตริงเป็น UTF-8 โดยไม่ทราบว่าชุดอักขระดั้งเดิมหรืออย่างน้อยลอง


146

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

ปัญหาหลักสำหรับฉันคือฉันไม่รู้ว่าการเข้ารหัสแหล่งที่มาของสตริงใดจะเป็น - อาจมาจากกล่องข้อความ (การใช้<form accept-charset="utf-8">จะมีประโยชน์ก็ต่อเมื่อผู้ใช้ส่งฟอร์มจริง) หรืออาจเป็น จากไฟล์ข้อความที่อัปโหลดดังนั้นฉันจึงไม่สามารถควบคุมอินพุตได้

สิ่งที่ฉันต้องการคือฟังก์ชั่นหรือคลาสที่ทำให้แน่ใจว่าสิ่งต่าง ๆ ที่จะเข้าสู่ฐานข้อมูลของฉันคือเท่าที่เป็นไปได้เข้ารหัส UTF-8 ฉันได้ลองแล้วiconv(mb_detect_encoding($text), "UTF-8", $text); แต่มีปัญหา (ถ้าอินพุตคือ 'fiancée' จะส่งคืน 'fianc') ฉันได้ลองทำหลายสิ่งหลายอย่าง = /

สำหรับการอัปโหลดไฟล์ฉันชอบที่จะขอให้ผู้ใช้ระบุการเข้ารหัสที่พวกเขาใช้และแสดงตัวอย่างของสิ่งที่เอาท์พุตจะเป็นอย่างไร แต่มันก็ไม่ได้ช่วยแฮกเกอร์ที่น่ารังเกียจ ง่ายขึ้นเล็กน้อย)

ฉันได้อ่านคำถาม SO อื่น ๆ ในหัวข้อ แต่ดูเหมือนว่าทุกคนมีความแตกต่างเล็กน้อยเช่น "ฉันต้องแยกวิเคราะห์ RSS ฟีด" หรือ "ฉันขูดข้อมูลจากเว็บไซต์" (หรือแน่นอน "คุณไม่สามารถ")

แต่ต้องมีบางสิ่งที่อย่างน้อยก็ต้องลองดี!


5
โดยทั่วไปแล้วมันเป็นไปไม่ได้ที่จะให้คำจำกัดความถูกต้อง แต่ในความเป็นจริงอัตราความสำเร็จในการเดาการเข้ารหัสที่ไม่รู้จักนั้นไม่ยอดเยี่ยม เป็นไปได้ที่จะใช้การวิเคราะห์พฤติกรรม แต่จะถูกต้องน้อยกว่า 100% ของเวลาขึ้นอยู่กับวัสดุที่น้อยกว่า 100% คุณต้องระวังให้ดี อย่างน้อยบางคนที่นี่อาจแนะนำห้องสมุดที่มีฮิวริสติกได้ดี
หลอกลวง

แน่นอนฉันรู้ว่าไม่มีวิธีแก้ปัญหาที่สมบูรณ์แบบ - ดังนั้นความต้องการบางอย่างที่จะเป็นไปได้อย่างดี
กลัว ...

สิ่งนี้อาจช่วยได้: stackoverflow.com/q/505562/642173
Melsi

คุณเคยลองใช้UTF-8//IGNOREเป็น param ที่ 2 iconvหรือไม่?
ไฟ

ใช่นั่นคือสิ่งที่ฉันทำลงเอย ไม่สมบูรณ์อย่างเห็นได้ชัดเมื่อนั้น 'คู่หมั้น' กลายเป็น 'คู่หมั้น' แต่ก็ดีขึ้นอย่างแน่นอน ทำไม TRANSLIT ถึงไม่ทำงาน
กลัว ...

คำตอบ:


255

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

อย่างไรก็ตามคุณสามารถลองทำสิ่งนี้:

iconv(mb_detect_encoding($text, mb_detect_order(), true), "UTF-8", $text);

การตั้งค่าให้เข้มงวดอาจช่วยให้คุณได้ผลลัพธ์ที่ดีขึ้น


5
โปรดดูmb_detect_encodingรหัสต้นฉบับใน php distro ของคุณ (ที่นี่: ext / mbstring / libmbfl / mbfl / mbfl_ident.c) ฟังก์ชั่นนี้ใช้งานไม่ได้เลย สำหรับการเข้ารหัสบางอย่างมันยังมี "ผลตอบแทนจริง" lol อื่น ๆ อยู่ในฟังก์ชัน Ctrl + c Ctrl + v นั่นเป็นเพราะคุณไม่สามารถตรวจจับการเข้ารหัสโดยไม่มีพจนานุกรมหรือวิธีการทางสถิติ (เช่นของฉัน)
Oroboros102

1
วิธีที่ฉันเข้าใจนั้นmb_detect_encodingต้องผ่านรายการของการเข้ารหัสที่ให้มาและยอมรับสิ่งแรกที่ไม่มีลำดับไบต์ที่ไม่ถูกต้องในสตริง ... สำหรับการเข้ารหัสที่ไม่มีลำดับไบต์ที่ไม่ถูกต้องเช่น ISO-8859-1 มันจะเป็นจริงเสมอ . ไม่มีฮิวริสติกแบบ "ฉลาด" และผลลัพธ์จะแตกต่างกันอย่างมากกับรายการ (และคำสั่ง) ของการเข้ารหัสที่คุณผ่าน
wutz

ดูเหมือนว่าจะใช้งานได้สำหรับฉัน ผู้ใช้ของฉันกำลังส่งข้อความในหน้า utf8 ที่มี tinymce แต่ด้วยเหตุผลที่ไม่ทราบสาเหตุบางอย่างที่ไม่ใช่อักขระ utf8 บางครั้งก็สิ้นสุดลงในฐานข้อมูล การแก้ไขนี้ขอบคุณมาก
giorgio79

@Jeff Day - ขอบคุณสำหรับสิ่งนี้ ให้อภัยความไม่รู้ของฉันคุณหมายถึง 'การตั้งค่าให้เข้มงวด'
Ash501

[Jeff Day] กำลังส่งmb_detect_order()แม้ว่ามันจะเป็นค่าเริ่มต้นสำหรับ param นี้เพราะเขาต้องการตั้งค่าการตรวจจับการเข้ารหัสที่เข้มงวดเป็นจริง (param ที่ 3) :)
jave.web

28

ในมาตุภูมิรัสเซียเรามีการเข้ารหัสยอดนิยม 4 รายการดังนั้นคำถามของคุณเป็นที่ต้องการอย่างมากที่นี่

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

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

ผู้ชายคนหนึ่งที่นี่ในบล็อกเทคโนโลยีรัสเซียยอดนิยมคิดค้นวิธีการนี้:

สร้างช่วงความน่าจะเป็นของรหัสถ่านในการเข้ารหัสทุกครั้งที่คุณต้องการให้การสนับสนุน คุณสามารถสร้างมันโดยใช้ข้อความขนาดใหญ่ในภาษาของคุณ (เช่นนิยายบางเรื่องใช้เช็คสเปียร์เป็นภาษาอังกฤษและ Tolstoy สำหรับรัสเซีย, ฮ่า ๆ ) คุณจะได้รับแบบนี้:

    encoding_1:
    190 => 0.095249209893009,
    222 => 0.095249209893009,
    ...
    encoding_2:
    239 => 0.095249209893009,
    207 => 0.095249209893009,
    ...
    encoding_N:
    charcode => probabilty

ต่อไป. คุณใช้ข้อความในการเข้ารหัสที่ไม่รู้จักและสำหรับการเข้ารหัสทุกครั้งใน "พจนานุกรมความน่าจะเป็น" คุณค้นหาความถี่ของสัญลักษณ์ทั้งหมดในข้อความที่ไม่รู้จักที่เข้ารหัส ผลรวมความน่าจะเป็นของสัญลักษณ์ การเข้ารหัสที่มีเรทติ้งที่มากกว่านั้นเป็นผู้ชนะ ผลลัพธ์ที่ดีขึ้นสำหรับข้อความที่ใหญ่ขึ้น

หากคุณสนใจฉันยินดีที่จะช่วยคุณในงานนี้ เราสามารถเพิ่มความแม่นยำได้อย่างมากโดยการสร้างรายการความน่าจะเป็นแบบสองอักขระ

Btw mb_detect_encoding อย่างแน่นอนไม่ทำงาน ใช่เลย โปรดดูรหัสแหล่ง mb_detect_encoding ใน "ext / mbstring / libmbfl / mbfl / mbfl_ident.c"


11

คุณอาจลองทำสิ่งนี้ แต่ทำไมไม่ใช้ฟังก์ชั่น mb_convert_encoding? มันจะพยายามตรวจจับชุดอักขระถ่านของข้อความที่ให้ไว้โดยอัตโนมัติหรือคุณสามารถส่งผ่านรายการได้

นอกจากนี้ฉันพยายามเรียกใช้:

$text = "fiancée";
echo mb_convert_encoding($text, "UTF-8");
echo "<br/><br/>";
echo iconv(mb_detect_encoding($text), "UTF-8", $text);

และผลลัพธ์ก็เหมือนกันสำหรับทั้งคู่ คุณเห็นว่าข้อความของคุณถูกตัดเป็น 'fianc' ได้อย่างไร มันอยู่ในฐานข้อมูลหรือในเบราว์เซอร์?


ในฐานข้อมูลดูเหมือน - ฉันเพิ่งลองรหัสของคุณและฉันเห็นด้วย
กลัว ...

1
ตรวจสอบเพื่อให้แน่ใจว่าการเปรียบเทียบที่คุณได้กำหนดไว้ในตาราง / คอลัมน์คือ UTF-8 เช่นกัน
Alexey Gerasimov

@AlexeyGerasimov iconvผมคิดว่าผมต้องการจริงๆที่จะตรวจสอบ ฉันพยายามทำวิธี mb_ * ที่บริสุทธิ์ คุณคิดอย่างไร
Anthony Rutledge

5

ไม่มีวิธีในการระบุชุดอักขระของสตริงที่ถูกต้องสมบูรณ์ มีวิธีที่จะลองเดาชุดอักขระ หนึ่งในวิธีเหล่านี้และอาจเป็น / ที่ดีที่สุดใน PHP คือ mb_detect_encoding () นี่จะสแกนสตริงของคุณและค้นหาสิ่งที่ไม่ซ้ำกับชุดอักขระบางชุด ขึ้นอยู่กับสายอักขระของคุณอาจไม่มีเหตุการณ์ที่แตกต่างดังกล่าว

ใช้ชุดอักขระ ISO-8859-1 เทียบกับ ISO-8859-15 ( http://en.wikipedia.org/wiki/ISO/IEC_8859-15#Changes_from_ISO-8859-1 )

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

(หมายเหตุ: คุณสามารถเพิ่มปัจจัยมนุษย์หรือเทคนิคการสแกนขั้นสูงยิ่งขึ้น (เช่นสิ่งที่ Oroboros102 แนะนำ) เพื่อพยายามคิดตามบริบทโดยรอบหากตัวละครควรเป็น¤หรือ€แม้ว่ามันจะดูเหมือนสะพาน ไกลเกินไป)

มีความแตกต่างที่ชัดเจนมากขึ้นระหว่าง UTF-8 และ ISO-8859-1 ดังนั้นคุณควรลองคิดดูเมื่อคุณไม่แน่ใจแม้ว่าคุณจะสามารถทำได้และไม่ควรเชื่อถือได้

อ่านที่น่าสนใจ: http://kore-nordmann.de/blog/php_charset_encoding_FAQ.html#how-do-i-determine-the-charset-encoding-of-a-string

มีวิธีอื่นในการตรวจสอบชุดอักขระที่ถูกต้องว่า เกี่ยวกับแบบฟอร์มพยายามบังคับใช้ UTF-8 ให้มากที่สุด (ตรวจสอบตุ๊กตาหิมะเพื่อให้แน่ใจว่าการส่งของคุณจะเป็น UTF-8 ในทุกเบราว์เซอร์: http://intertwingly.net/blog/2010/07/29/Rails-and -Snowmen ) การทำอย่างน้อยที่สุดคุณสามารถมั่นใจได้ว่าทุกข้อความที่ส่งผ่านแบบฟอร์มของคุณคือ utf_8 เกี่ยวกับไฟล์ที่อัปโหลดลองใช้คำสั่ง unix 'file -i' ผ่านมันเช่น exec () (ถ้าเป็นไปได้บนเซิร์ฟเวอร์ของคุณ) เพื่อช่วยตรวจจับ (ใช้ BOM ของเอกสาร) เกี่ยวกับข้อมูลการคัดลอกคุณสามารถอ่านส่วนหัว HTTP ได้ ที่มักจะระบุชุดอักขระ เมื่อวิเคราะห์ไฟล์ XML ดูว่า XML meta-data มีข้อกำหนดชุดอักขระหรือไม่

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


แบบฟอร์มและลิงค์ลงทะเบียนอีเมลพร้อมข้อมูลที่เข้ารหัส นั่นคือที่ฉันพยายามทำให้อินพุตของฉันเป็น UTF-8 หรือไม่ คุณคิดอย่างไรกับคำตอบของฉัน ความเห็นที่เป็นประโยชน์ชื่นชม ขอบคุณ
Anthony Rutledge

3

มีคำตอบที่ดีและพยายามตอบคำถามของคุณที่นี่ ฉันไม่ใช่ผู้เชี่ยวชาญการเข้ารหัส แต่ฉันเข้าใจความต้องการของคุณที่จะมีUTF-8 ล้วนๆมาจนถึงฐานข้อมูลของคุณ ฉันใช้การutf8mb4เข้ารหัสของ MySQL สำหรับตารางเขตข้อมูลและการเชื่อมต่อ

สถานการณ์ของฉันต้มลงไปที่ "ฉันแค่ต้องการให้ sanitizers, validators, ตรรกะทางธุรกิจของฉันและคำสั่งที่เตรียมไว้เพื่อจัดการกับ UTF-8 เมื่อข้อมูลมาจากแบบฟอร์ม HTML หรือลิงก์การลงทะเบียนอีเมล" ด้วยวิธีง่าย ๆ ของฉันฉันเริ่มด้วยแนวคิดนี้:

  1. พยายามตรวจจับการเข้ารหัส: $encodings = ['UTF-8', 'ISO-8859-1', 'ASCII'];
  2. หากไม่สามารถตรวจจับการเข้ารหัสได้ throw new RuntimeException
  3. หากอินพุตคือUTF-8ให้ดำเนินการต่อ
  4. ถ้ามันเป็นISO-8859-1หรือASCII

    พยายามแปลงเป็น UTF-8 (รอไม่ใช่เสร็จ)

    ข ตรวจจับการเข้ารหัสของค่าที่แปลงแล้ว

    ค. หากค่าการเข้ารหัสและการแปลงที่รายงานมีทั้งคู่UTF-8ให้ดำเนินการต่อ

    d อื่น,throw new RuntimeException

จากระดับนามธรรมของฉัน Sanitizer

เจลทำความสะอาด

    private function isUTF8($encoding, $value)
    {
        return (($encoding === 'UTF-8') && (utf8_encode(utf8_decode($value)) === $value));
    }

    private function utf8tify(&$value)
    {
        $encodings = ['UTF-8', 'ISO-8859-1', 'ASCII'];

        mb_internal_encoding('UTF-8');
        mb_substitute_character(0xfffd); //REPLACEMENT CHARACTER
        mb_detect_order($encodings);

        $stringEncoding = mb_detect_encoding($value, $encodings, true);

        if (!$stringEncoding) {
            $value = null;
            throw new \RuntimeException("Unable to identify character encoding in sanitizer.");
        }

        if ($this->isUTF8($stringEncoding, $value)) {
            return;
        } else {
            $value = mb_convert_encoding($value, 'UTF-8', $stringEncoding);
            $stringEncoding = mb_detect_encoding($value, $encodings, true);

            if ($this->isUTF8($stringEncoding, $value)) {
                return;
            } else {
                $value = null;
                throw new \RuntimeException("Unable to convert character encoding from ISO-8859-1, or ASCII, to UTF-8 in Sanitizer.");
            }
        }

        return;
    }

หนึ่งอาจโต้แย้งว่าผมควรจะแยกความกังวลการเข้ารหัสจากนามธรรมของฉันSanitizerระดับและก็ฉีดวัตถุเป็นเช่นเด็กที่เป็นรูปธรรมของEncoder Sanitizerอย่างไรก็ตามปัญหาหลักของวิธีการของฉันคือถ้าไม่มีความรู้เพิ่มเติมฉันก็แค่ปฏิเสธประเภทการเข้ารหัสที่ฉันไม่ต้องการ (และฉันพึ่งฟังก์ชั่น PHP mb_ *) หากไม่มีการศึกษาเพิ่มเติมฉันไม่สามารถรู้ได้ว่าสิ่งนั้นสร้างความเสียหายแก่ประชากรบ้างหรือไม่ (หรือถ้าฉันสูญเสียข้อมูลที่สำคัญไป) ดังนั้นฉันต้องเรียนรู้เพิ่มเติม ฉันพบบทความนี้แล้ว

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

นอกจากนี้จะเกิดอะไรขึ้นเมื่อข้อมูลที่เข้ารหัสถูกเพิ่มลงในลิงก์การลงทะเบียนอีเมลของฉัน (โดยใช้OpenSSLหรือmcrypt) สิ่งนี้อาจรบกวนการถอดรหัสหรือไม่ แล้ว Windows-1252 ล่ะ? สิ่งที่เกี่ยวกับความปลอดภัย การใช้utf8_decode()และutf8_encode()ในSanitizer::isUTF8มีพิรุธ

ผู้คนได้ชี้ให้เห็นถึงการมาระยะสั้นในฟังก์ชั่น PHP mb_ * ฉันไม่เคยใช้เวลาสำรวจiconvแต่ถ้ามันทำงานได้ดีกว่าฟังก์ชั่น mb_ * แจ้งให้ฉันทราบ


ฉันพบสิ่งนี้, stackoverflow.com/a/3521396/1429677คำตอบที่ยอดเยี่ยมสำหรับปัญหานี้นี่คือ lib github.com/neitanod/forceutf8
Llewellyn

2

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

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

หากเป็นไฟล์คุณจะไม่บันทึกเป็น UTF-8 ที่เข้ารหัสลงในฐานข้อมูล แต่อยู่ในรูปแบบไบนารี เมื่อคุณส่งออกไฟล์อีกครั้งให้ใช้เอาต์พุตไบนารีเช่นกันซึ่งจะโปร่งใส

ความคิดของคุณเป็นสิ่งที่ดีที่ผู้ใช้สามารถเข้ารหัสได้ไม่ว่าเขา / เธอจะสามารถบอกได้ว่าหลังจากดาวน์โหลดไฟล์แล้วเนื่องจากเป็นไบนารี

ดังนั้นฉันต้องยอมรับว่าฉันไม่เห็นปัญหาเฉพาะที่คุณถาม แต่บางทีคุณสามารถเพิ่มรายละเอียดเพิ่มเติมว่าปัญหาของคุณคืออะไร


คุณจะเห็นและมีปัญหากับคำตอบของฉัน? ความคิดเห็นที่สร้างสรรค์ได้รับการชื่นชม ขอบคุณ
Anthony Rutledge

1

คุณสามารถตั้งค่าชุดของตัวชี้วัดเพื่อพยายามเดาว่าจะใช้การเข้ารหัสใด อีกครั้งไม่สมบูรณ์แบบ แต่อาจพลาดจาก mb_detect_encoding ()


ใช่พูดถึงการmb_detect_encoding()คิดถึงคุณคิดว่าคำตอบของฉันมีโอกาสเป็นสโนว์บอลในฤดูร้อนในทะเลทรายซาฮาร่าหรือไม่?
Anthony Rutledge

1

หากคุณยินดีที่จะ "ใช้เวลานี้ไปยังคอนโซล" encaผมอยากแนะนำให้ แตกต่างจากความเรียบง่ายค่อนข้างmb_detect_encodingจะใช้ "ส่วนผสมของการแยกวิเคราะห์ทางสถิติการคาดเดาและเวทมนตร์สีดำเพื่อตรวจสอบการเข้ารหัสของพวกเขา" (ฮ่า ๆ - ดูหน้าคน ) อย่างไรก็ตามคุณมักจะต้องผ่านภาษาของไฟล์อินพุตหากคุณต้องการตรวจจับการเข้ารหัสเฉพาะประเทศดังกล่าว (อย่างไรก็ตามโดยmb_detect_encodingพื้นฐานแล้วมีข้อกำหนดเดียวกันเนื่องจากการเข้ารหัสจะต้องปรากฏ "ในตำแหน่งที่ถูกต้อง" ในรายการการเข้ารหัสที่ผ่านเพื่อให้สามารถตรวจพบได้ทั้งหมด)

encaขึ้นมาที่นี่ด้วย: วิธีค้นหาการเข้ารหัสไฟล์ใน Unix ผ่านสคริปต์


1

ดูเหมือนว่าคำถามของคุณจะได้รับคำตอบ แต่ฉันมีวิธีการที่จะลดความซับซ้อนของกรณีคุณ:

ฉันมีปัญหาคล้ายกันที่พยายามส่งคืนข้อมูลสตริงจาก mysql แม้กำหนดค่าฐานข้อมูลและ php เพื่อส่งคืนสตริงที่จัดรูปแบบเป็น utf-8 วิธีเดียวที่ฉันได้รับข้อผิดพลาดจริง ๆ แล้วคืนพวกเขาจากฐานข้อมูล

ในที่สุดการแล่นเรือผ่านเว็บฉันพบวิธีที่ง่ายมากในการจัดการกับมัน:

ให้คุณสามารถบันทึกข้อมูลสตริงทุกประเภทใน mysql ของคุณในรูปแบบและการเรียงที่แตกต่างกันสิ่งที่คุณต้องทำคือขวาที่ไฟล์การเชื่อมต่อ php ของคุณตั้งค่า collation เป็น utf-8 ดังนี้:

$connection = new mysqli($server, $user, $pass, $db);
$connection->set_charset("utf8");

ซึ่งหมายความว่าครั้งแรกที่คุณบันทึกข้อมูลในรูปแบบหรือการเปรียบเทียบและคุณแปลงเฉพาะที่กลับไปที่ไฟล์ php ของคุณ

หวังว่ามันจะเป็นประโยชน์!



-2
public function convertToUtf8($text) {
    if(!$this->html)
        $this->html = cURL('http://'.$this->url, array('timeout' => 15));

    $html = $this->html;
    preg_match('/<meta.*?charset=(|\")(.*?)("|\")/i', $html, $matches);

    $charset = $matches[2];

    if($charset)
        return mb_convert_encoding($text, 'UTF-8', $charset);
    else
        return $text;
}

ตัวเลือกเริ่มต้นของ cURL:

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

ฉันลองทำอะไรแบบนี้ มันช่วยฉัน หากพบข้อมูล meta charset ฉันกำลังแปลงไม่ทำอะไรเลย


errr คุณช่วยตรวจสอบฟังก์ชั่นของคุณและแก้ไขตัวแปรได้ไหม?
Martin

$ url คืออะไร $ html คืออะไร
Martin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.