ฉันจะตรวจจับการเข้ารหัส / เพจรหัสของไฟล์ข้อความได้อย่างไร


295

ในแอปพลิเคชันของเราเราได้รับไฟล์ข้อความ ( .txt, .csvและอื่น ๆ ) จากแหล่งข้อมูลที่หลากหลาย เมื่ออ่านบางครั้งไฟล์เหล่านี้มีขยะเพราะไฟล์ที่สร้างขึ้นในเพจรหัสที่ไม่รู้จัก / ที่ไม่รู้จัก

มีวิธีการ (โดยอัตโนมัติ) ตรวจจับเพจรหัสของไฟล์ข้อความหรือไม่?

detectEncodingFromByteOrderMarksบนStreamReaderคอนสตรัค, ทำงานสำหรับUTF8 Unicode และทำเครื่องหมายไฟล์อื่น ๆ แต่ฉันกำลังมองหาวิธีที่จะตรวจสอบโค้ดเพจเช่น,ibm850windows1252


ขอบคุณสำหรับคำตอบนี่คือสิ่งที่ฉันทำ

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

สารละลาย:

  • เปิดไฟล์ที่ได้รับใน Notepad ดูข้อความที่อ่านไม่ออก ถ้าใครบางคนถูกเรียกว่าFrançoisหรืออะไรบางอย่างด้วยความฉลาดของมนุษย์คุณสามารถเดาได้
  • ฉันได้สร้างแอพเล็ก ๆ ที่ผู้ใช้สามารถใช้เพื่อเปิดไฟล์ด้วยและป้อนข้อความที่ผู้ใช้รู้ว่ามันจะปรากฏในไฟล์เมื่อใช้เพจรหัสที่ถูกต้อง
  • วนรอบเพจรหัสทั้งหมดและแสดงรายการที่ให้การแก้ไขกับข้อความที่ผู้ใช้ให้ไว้
  • หากมีเพจเพจมากกว่าหนึ่งเพจปรากฏขึ้นขอให้ผู้ใช้ระบุข้อความเพิ่มเติม

คำตอบ:


260

คุณไม่สามารถตรวจพบเพจรหัสได้คุณจำเป็นต้องได้รับแจ้ง คุณสามารถวิเคราะห์ไบต์และคาดเดาได้ แต่นั่นอาจให้ผลลัพธ์ที่แปลกประหลาด (บางครั้งน่าขบขัน) ฉันหามันไม่พบในตอนนี้ แต่ฉันแน่ใจว่า Notepad สามารถหลอกให้แสดงข้อความภาษาอังกฤษเป็นภาษาจีนได้

อย่างไรก็ตามนี่คือสิ่งที่คุณจะต้องอ่าน: นักพัฒนาแอปโซลูทุกขั้นต่ำของซอฟท์แวแน่นอนบวกต้องทราบเกี่ยวกับ Unicode และชุดตัวอักษร (ไม่มีข้อแก้ตัว!)

Joel กล่าวโดยเฉพาะ:

ความจริงที่สำคัญที่สุดเกี่ยวกับการเข้ารหัสเดี่ยว

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

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


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

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

4
@geneorama, ดำเนินการต่อ ... ในที่สุดฉันก็คิดว่าเหตุผลหลักที่บทความไม่ตอบคำถามก็เพราะว่ามันไม่มีคำตอบง่ายๆสำหรับคำถามนั้น หากคำถามคือ "ฉันจะเดาได้อย่างไร ... " จากนั้นฉันก็จะตอบแตกต่างกัน
กิจการร่วมค้า

1
@JV ฉันรู้ภายหลังว่า xml / html สามารถระบุการเข้ารหัสอักขระได้ขอบคุณที่กล่าวถึงชิ้นอาหารอันโอชะที่มีประโยชน์
genorama

1
@JV "สร้างไฟล์" อาจเป็นคำที่ไม่ถูกต้อง ฉันคิดว่าผู้ใช้สามารถระบุการเข้ารหัสของไฟล์ที่ผู้ใช้สร้าง เมื่อเร็ว ๆ นี้ฉัน "สร้าง" ไฟล์จาก Hadoop Cluster โดยใช้ Hive และส่งต่อไปยัง FTP ก่อนที่จะดาวน์โหลดไปยังเครื่องไคลเอนต์ต่างๆ ผลลัพธ์มีขยะยูนิโค้ดอยู่ แต่ฉันไม่รู้ว่าขั้นตอนใดที่สร้างปัญหา ฉันไม่ได้ระบุการเข้ารหัสอย่างชัดเจน ฉันหวังว่าฉันจะสามารถตรวจสอบการเข้ารหัสในแต่ละขั้นตอน
genorama

31

หากคุณต้องการตรวจจับการเข้ารหัสที่ไม่ใช่ UTF (เช่นไม่มี BOM) คุณจะต้องใช้การวิเคราะห์พฤติกรรมและการวิเคราะห์เชิงสถิติของข้อความ คุณอาจต้องการดูกระดาษ Mozilla ในการตรวจจับชุดอักขระสากล ( ลิงก์เดียวกันด้วยการจัดรูปแบบที่ดีขึ้นผ่านเครื่อง Wayback )


9
สนุกพอที่การติดตั้ง Firefox 3.05 ของฉันจะตรวจพบหน้านั้นเป็น UTF-8 ซึ่งแสดงสัญลักษณ์ร่ายมนตร์แบบฝังเพชรในขณะที่แหล่งข่าวมีเมตาแท็กสำหรับ Windows-1252 การเปลี่ยนการเข้ารหัสอักขระด้วยตนเองแสดงเอกสารอย่างถูกต้อง
devstuff

5
ประโยคของคุณ "หากคุณต้องการตรวจจับการเข้ารหัสที่ไม่ใช่ UTF (เช่นไม่มี BOM)" ทำให้เข้าใจผิดเล็กน้อย มาตรฐาน unicode ไม่แนะนำให้เพิ่ม BOM ลงในเอกสาร utf-8! (และคำแนะนำนี้หรือขาดมันเป็นแหล่งที่มาของอาการปวดหัวจำนวนมาก) การอ้างอิง: en.wikipedia.org/wiki/Byte_order_mark#UTF-8
Tao

สิ่งนี้ถูกทำเพื่อให้คุณสามารถเชื่อมโยงสตริง UTF-8 ได้โดยไม่ต้องสะสม BOM ซ้ำซ้อน นอกจากนี้ยังไม่จำเป็นต้องใช้เครื่องหมาย Byte-Order สำหรับ UTF-8 ซึ่งแตกต่างจาก UTF-16
sashoalm

26

คุณได้ลองC # port สำหรับ Mozilla Universal Charset Detector แล้วหรือยัง

ตัวอย่างจากhttp://code.google.com/p/ude/

public static void Main(String[] args)
{
    string filename = args[0];
    using (FileStream fs = File.OpenRead(filename)) {
        Ude.CharsetDetector cdet = new Ude.CharsetDetector();
        cdet.Feed(fs);
        cdet.DataEnd();
        if (cdet.Charset != null) {
            Console.WriteLine("Charset: {0}, confidence: {1}", 
                 cdet.Charset, cdet.Confidence);
        } else {
            Console.WriteLine("Detection failed.");
        }
    }
}    

1
ทำงานได้อย่างไม่มีที่ติสำหรับประเภท Windows-1252
seebiscuit

และคุณจะใช้มันเพื่ออ่านไฟล์ข้อความเพื่อใช้สตริงนั้นได้อย่างไร? CharsetDetector ส่งกลับชื่อของการเข้ารหัสในรูปแบบสตริงและที่มัน ...
Bartosz

@Bartosz private Encoding GetEncodingFromString(string encoding) { try { return Encoding.GetEncoding(encoding); } catch { return Encoding.ASCII; } }
PrivatePyle

15

คุณไม่สามารถตรวจพบเพจรหัสได้

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

ด้วยจำนวนข้อความที่สมเหตุสมผลจึงเป็นไปได้ที่จะตรวจจับภาษาได้

นี่คืออีกหนึ่งฉันเพิ่งพบโดยใช้ Google:


39
"การวิเคราะห์พฤติกรรม" ดังนั้นเบราว์เซอร์จึงไม่สามารถตรวจจับได้มันทำการคาดเดาอย่างมีการศึกษา "ใช้งานได้ดีจริง ๆ " - ดังนั้นจึงไม่ทำงานตลอดเวลาใช่ไหม ฟังดูแล้วเหมือนว่าเราเห็นด้วย
กิจการร่วมค้า

10
มาตรฐานสำหรับ HTML กำหนดว่าหากชุดอักขระไม่ได้ถูกกำหนดโดยเอกสารดังนั้นจึงควรพิจารณาให้เข้ารหัสเป็น UTF-8
Jon Trauntvein

5
อันไหนดีเว้นแต่เรากำลังอ่านเอกสาร HTML ที่ไม่ได้มาตรฐาน หรือเอกสารที่ไม่ใช่ HTML
คอส

2
คำตอบนี้ผิดดังนั้นฉันต้องลงคะแนน การบอกว่ามันผิดถ้าคุณไม่สามารถตรวจจับเพจรหัสได้ คุณสามารถเดาได้และการเดาของคุณนั้นค่อนข้างดี แต่คุณไม่สามารถ "ตรวจจับ" เพจรหัสได้
z80crew

1
@JonTrauntvein ตามข้อมูลจำเพาะของ HTML5 a character encoding declaration is required even if the encoding is US-ASCII - ผลการประกาศที่ขาดหายไปในการใช้อัลกอริทึมแบบฮิวริสติกไม่ใช่การย้อนกลับไปยัง UTF8
z80crew

9

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

http://www.architectshack.com/TextFileEncodingDetector.ashx

ข้อดี:

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

หมายเหตุ: ฉันเป็นคนที่เขียนวิชานี้ดังนั้นเอาเกลือเม็ดหนึ่งไปเลย! :)



7

มองหาทางออกที่แตกต่างฉันพบว่า

https://code.google.com/p/ude/

วิธีแก้ปัญหานี้ค่อนข้างหนัก

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

http://lists.w3.org/Archives/Public/www-validator/2002Aug/0084.html

เขียนขึ้นสำหรับ Java

    public static Encoding DetectEncoding(byte[] fileContent)
    {
        if (fileContent == null)
            throw new ArgumentNullException();

        if (fileContent.Length < 2)
            return Encoding.ASCII;      // Default fallback

        if (fileContent[0] == 0xff
            && fileContent[1] == 0xfe
            && (fileContent.Length < 4
                || fileContent[2] != 0
                || fileContent[3] != 0
                )
            )
            return Encoding.Unicode;

        if (fileContent[0] == 0xfe
            && fileContent[1] == 0xff
            )
            return Encoding.BigEndianUnicode;

        if (fileContent.Length < 3)
            return null;

        if (fileContent[0] == 0xef && fileContent[1] == 0xbb && fileContent[2] == 0xbf)
            return Encoding.UTF8;

        if (fileContent[0] == 0x2b && fileContent[1] == 0x2f && fileContent[2] == 0x76)
            return Encoding.UTF7;

        if (fileContent.Length < 4)
            return null;

        if (fileContent[0] == 0xff && fileContent[1] == 0xfe && fileContent[2] == 0 && fileContent[3] == 0)
            return Encoding.UTF32;

        if (fileContent[0] == 0 && fileContent[1] == 0 && fileContent[2] == 0xfe && fileContent[3] == 0xff)
            return Encoding.GetEncoding(12001);

        String probe;
        int len = fileContent.Length;

        if( fileContent.Length >= 128 ) len = 128;
        probe = Encoding.ASCII.GetString(fileContent, 0, len);

        MatchCollection mc = Regex.Matches(probe, "^<\\?xml[^<>]*encoding[ \\t\\n\\r]?=[\\t\\n\\r]?['\"]([A-Za-z]([A-Za-z0-9._]|-)*)", RegexOptions.Singleline);
        // Add '[0].Groups[1].Value' to the end to test regex

        if( mc.Count == 1 && mc[0].Groups.Count >= 2 )
        {
            // Typically picks up 'UTF-8' string
            Encoding enc = null;

            try {
                enc = Encoding.GetEncoding( mc[0].Groups[1].Value );
            }catch (Exception ) { }

            if( enc != null )
                return enc;
        }

        return Encoding.ASCII;      // Default fallback
    }

ก็เพียงพอที่จะอ่านอาจ 1024 ไบต์แรกจากไฟล์ แต่ฉันกำลังโหลดไฟล์ทั้งหมด


7

หากใครบางคนกำลังมองหาวิธีการแก้ปัญหา 93.9% สิ่งนี้ใช้ได้กับฉัน:

public static class StreamExtension
{
    /// <summary>
    /// Convert the content to a string.
    /// </summary>
    /// <param name="stream">The stream.</param>
    /// <returns></returns>
    public static string ReadAsString(this Stream stream)
    {
        var startPosition = stream.Position;
        try
        {
            // 1. Check for a BOM
            // 2. or try with UTF-8. The most (86.3%) used encoding. Visit: http://w3techs.com/technologies/overview/character_encoding/all/
            var streamReader = new StreamReader(stream, new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true), detectEncodingFromByteOrderMarks: true);
            return streamReader.ReadToEnd();
        }
        catch (DecoderFallbackException ex)
        {
            stream.Position = startPosition;

            // 3. The second most (6.7%) used encoding is ISO-8859-1. So use Windows-1252 (0.9%, also know as ANSI), which is a superset of ISO-8859-1.
            var streamReader = new StreamReader(stream, Encoding.GetEncoding(1252));
            return streamReader.ReadToEnd();
        }
    }
}

ทางออกที่ดีมาก หนึ่งสามารถห่อเนื้อหาของ ReadAsString () ในวงวนของการเข้ารหัสที่อนุญาตได้หากอนุญาตมากกว่า 2 การเข้ารหัส (UTF-8 และ ASCI 1252)
ViRuSTriNiTy

หลังจากลองตัวอย่างมากมายในที่สุดฉันก็ไปหาคุณ ตอนนี้ฉันอยู่ในสถานที่ที่มีความสุข ขอบคุณมาก !!!!!!!
Sedrick

นี่อาจไม่ใช่คำตอบของวิธีการตรวจหา 1252 กับ 1250 แต่ควรเป็นคำตอบสำหรับ "วิธีการตรวจจับ UTF-8" โดยมีหรือไม่มี BOM !!
chuckc

4

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

เนื่องจากพจนานุกรม (แฮช) คุณใช้ข้อความป้อนข้อมูลของคุณและ:

  • ถ้ามันเริ่มต้นด้วยอักขระ BOM ใด ๆ ('\ xfe \ xff' สำหรับ UTF-16-BE, '\ xff \ xfe' สำหรับ UTF-16-LE, '\ xef \ xbb \ xbf' สำหรับ UTF-8 ฯลฯ ) ฉัน ปฏิบัติต่อมันตามที่แนะนำ
  • ถ้าไม่เช่นนั้นให้นำตัวอย่างข้อความที่มีขนาดใหญ่พอใช้ตัวอย่างไบต์คู่ทั้งหมดแล้วเลือกการเข้ารหัสที่น้อยที่สุดที่แนะนำจากพจนานุกรม

หากคุณสุ่มตัวอย่างข้อความที่เข้ารหัสด้วย UTF ที่ไม่ได้เริ่มต้นด้วย BOM ใด ๆ ขั้นตอนที่สองจะครอบคลุมเนื้อหาที่เลื่อนจากขั้นตอนแรก

จนถึงตอนนี้มันใช้งานได้สำหรับฉัน (ข้อมูลตัวอย่างและข้อมูลอินพุตที่ตามมาคือคำบรรยายในภาษาต่างๆ) ที่มีอัตราความผิดพลาดลดลง


4

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

บน Ubuntu apt-get install uchardetคุณเพียงแค่

ในระบบอื่น ๆ รับที่มาการใช้ & เอกสารที่นี่: https://github.com/BYVoid/uchardet


สำหรับ Mac ผ่าน homebrew:brew install uchardet
Paul B

3

ตัวสร้างคลาส StreamReader ใช้พารามิเตอร์ 'ตรวจจับการเข้ารหัส'


มันเป็นเพียงแค่ "เข้ารหัส" ลิงค์ที่นี่ .. และคำอธิบายบอกว่าเราจะต้องให้การเข้ารหัส ..
SurajS

@SurajS: ดูโอเวอร์โหลดอื่น ๆ
leppie

ผู้เขียนต้นฉบับต้องการตรวจจับการเข้ารหัสไฟล์ซึ่งอาจไม่มีเครื่องหมาย BOM StreamReader ตรวจจับการเข้ารหัสจากส่วนหัว BOM ตามลายเซ็น สาธารณะ StreamReader (สตรีมสตรีม, เครื่องตรวจจับบูลการ
เข้ารหัสจาก BitByteOrderMarks

1

หากคุณสามารถเชื่อมโยงไปยังห้องสมุด C libencaคุณสามารถใช้ ดูhttp://cihar.com/software/enca/ จากหน้าคน:

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

มันคือ GPL v2


0

พบปัญหาเดียวกัน แต่ไม่พบวิธีแก้ไขที่ดีในการตรวจหาโดยอัตโนมัติ ตอนนี้ฉันใช้ PsPad (www.pspad.com) เพื่อสิ่งนั้น;) ใช้งานได้ดี


0

เนื่องจากโดยพื้นฐานแล้วมาจากการวิเคราะห์พฤติกรรมจึงอาจช่วยให้ใช้การเข้ารหัสไฟล์ที่ได้รับก่อนหน้านี้จากแหล่งเดียวกันเป็นคำใบ้แรก

คนส่วนใหญ่ (หรือแอปพลิเคชัน) ทำสิ่งต่าง ๆ ตามลำดับที่เหมือนกันทุกครั้งบ่อยครั้งบนเครื่องเดียวกันดังนั้นจึงค่อนข้างเป็นไปได้ว่าเมื่อ Bob สร้างไฟล์. csv และส่งไปยัง Mary มันจะใช้ Windows-1252 เสมอหรือ สิ่งที่เครื่องของเขาเริ่มต้น

ถ้าเป็นไปได้การฝึกอบรมลูกค้าสักเล็กน้อยไม่เคยเจ็บ :-)


0

จริงๆแล้วฉันกำลังมองหาวิธีทั่วไปไม่ใช่การเขียนโปรแกรมในการตรวจจับการเข้ารหัสไฟล์ แต่ฉันยังไม่พบสิ่งนั้น สิ่งที่ฉันค้นพบจากการทดสอบด้วยการเข้ารหัสที่แตกต่างกันคือข้อความของฉันคือ UTF-7

ดังนั้นที่ฉันทำครั้งแรก: StreamReader file = File.OpenText (fullfilename);

ฉันต้องเปลี่ยนเป็น: StreamReader file = new StreamReader (fullfilename, System.Text.Encoding.UTF7);

OpenText ถือว่าเป็น UTF-8

คุณยังสามารถสร้าง StreamReader เช่น StreamReader ใหม่ (fullfilename, true) พารามิเตอร์ที่สองหมายความว่าควรลองและตรวจจับการเข้ารหัสจาก byteordermark ของไฟล์ แต่มันไม่ได้ผลในกรณีของฉัน


@JohnMachin ฉันเห็นด้วยว่ามันหายาก แต่ได้รับคำสั่งเช่นในบางส่วนของโปรโตคอล IMAP ถ้านั่นคือที่ที่คุณอยู่คุณจะไม่ต้องเดา
tripleee

0

เปิดไฟล์ใน AkelPad (หรือเพียงแค่คัดลอก / วางข้อความที่อ่านไม่ออก) ไปที่ Edit -> Selection -> Recode ... -> ตรวจสอบ "Autodetect"


0

ในฐานะที่เป็น addon ถึงโพสต์ ITmeze ฉันได้ใช้ฟังก์ชั่นนี้เพื่อแปลงผลลัพธ์ของพอร์ต C # สำหรับ Mozilla Universal Charset Detector

    private Encoding GetEncodingFromString(string codePageName)
    {
        try
        {
            return Encoding.GetEncoding(codePageName);
        }
        catch
        {
            return Encoding.ASCII;
        }
    }

MSDN


0

ขอบคุณ @ Erik Aronestyuchardetสำหรับการกล่าวขวัญ

ในขณะเดียวกัน (? เดียวกัน) chardetเครื่องมือที่มีอยู่สำหรับลินุกซ์:
หรือบน cygwin chardetectคุณอาจต้องการที่จะใช้:

ดู: หน้าชาร์ด: https://www.commandlinux.com/man-page/man1/chardetect.1.html

วิธีนี้จะตรวจจับ (เดา) การเข้ารหัสอักขระสำหรับแต่ละไฟล์ที่กำหนดและจะรายงานชื่อและระดับความมั่นใจสำหรับการเข้ารหัสอักขระที่ตรวจพบของแต่ละไฟล์


-1

ฉันใช้รหัสนี้เพื่อตรวจจับ Unicode และ windows เป็นค่าเริ่มต้น ansi codepage เมื่ออ่านไฟล์ สำหรับ codings อื่น ๆ การตรวจสอบเนื้อหาเป็นสิ่งจำเป็นด้วยตนเองหรือโดยการเขียนโปรแกรม สามารถใช้เพื่อบันทึกข้อความด้วยการเข้ารหัสเช่นเดียวกับเมื่อมันถูกเปิด (ฉันใช้ VB.NET)

'Works for Default and unicode (auto detect)
Dim mystreamreader As New StreamReader(LocalFileName, Encoding.Default) 
MyEditTextBox.Text = mystreamreader.ReadToEnd()
Debug.Print(mystreamreader.CurrentEncoding.CodePage) 'Autodetected encoding
mystreamreader.Close()

-1

10Y (!) ผ่านไปนับตั้งแต่มีการถามและฉันก็ยังไม่เห็นการกล่าวถึงโซลูชันที่ดีและไม่ใช่GPLของ MS: IMultiLanguage2 API

ห้องสมุดส่วนใหญ่ที่กล่าวมาแล้วนั้นใช้ UDE ของ Mozilla และดูเหมือนว่าเหตุผลที่เบราว์เซอร์ได้จัดการกับปัญหาที่คล้ายกันแล้ว ฉันไม่รู้ว่าโซลูชันของ chrome คืออะไร แต่เนื่องจาก IE 5.0 MS ได้เปิดตัวแล้วและก็คือ:

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

มันเป็นสาย COM ดั้งเดิม แต่นี่เป็นงานที่ดีมากโดย Carsten Zeumer ที่จัดการกับการใช้งานอินเตอร์เน็ทสำหรับการใช้งาน. net มีคนอื่นอยู่รอบ ๆ แต่ห้องสมุดขนาดใหญ่นี้ไม่ได้รับความสนใจเท่าที่ควร

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