Encoding Tiếng Nhật

Traditional Japanese Encoding: Hiragana, Katakana, Kanji

Posted by Box XV on May 19, 2026. 4 min read.

Japanese Encoding

Đây là tổng quan các encoding hỗ trợ chữ Nhật (Hiragana/Katakana):

Encoding Nhật Bản truyền thống

Encoding Hiragana Katakana Kanji Tiếng Việt Ghi chú
Shift-JIS (CP932) Chuẩn phổ biến nhất ở Nhật. Không hỗ trợ ký tự có dấu tiếng Việt (ă, ơ, ư, đ…). Windows/Excel Nhật dùng mặc định.
EUC-JP Phổ biến trên Unix/Linux Nhật. Không hỗ trợ tiếng Việt có dấu.
ISO-2022-JP Dùng escape sequence để chuyển đổi bộ ký tự. Katakana hỗ trợ hạn chế. Dùng trong email cũ.

Encoding Unicode (hỗ trợ đa ngôn ngữ)

Encoding Hiragana Katakana Kanji Tiếng Việt Ghi chú
UTF-8 ⭐ Khuyến nghị Hỗ trợ toàn bộ Unicode. Tiêu chuẩn web/API hiện đại. Dùng BOM (utf-8-sig) để Excel nhận dạng đúng.
UTF-8 BOM (utf-8-sig) 📊 Excel-friendly Thêm BOM \xEF\xBB\xBF ở đầu file. Excel tự nhận dạng UTF-8 và hiển thị đúng cả tiếng Nhật lẫn tiếng Việt.
UTF-16 LE Mỗi ký tự 2 byte. Tương thích tốt với Windows. File to hơn UTF-8 nhưng đọc nhanh hơn với ký tự CJK.
UTF-32 Mỗi ký tự cố định 4 byte. Ít dùng vì lãng phí bộ nhớ. Xử lý đơn giản nhất về mặt lập trình.

Encoding Đông Á khác (tham khảo)

Encoding Hiragana Katakana Kanji Tiếng Việt Ghi chú
Big5 Tiếng Trung phồn thể (Đài Loan). Không hỗ trợ Hiragana/Katakana.
GB2312 / GBK Tiếng Trung giản thể (Đại lục). Một số Kanji trùng nhưng không hỗ trợ Kana.

Chú thích:

  • ✓ Hỗ trợ đầy đủ
  • △ Hỗ trợ một phần
  • ✗ Không hỗ trợ

Cách đọc file CSV có encoding hỗn hợp (Shift-JIS và UTF-8)

CSV Encoding

Phương pháp 1 — Tự động phát hiện encoding

using System;
using System.IO;
using System.Text;
using Microsoft.VisualBasic.FileIO; // cần thêm reference

// Đăng ký encoding provider để dùng Shift-JIS (CP932)
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

public static Encoding DetectEncoding(string filePath)
{
    byte[] buffer = new byte[4];
    using var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    int bytesRead = fs.Read(buffer, 0, 4);

    // UTF-8 BOM: EF BB BF
    if (bytesRead >= 3 && buffer[0] == 0xEF && buffer[1] == 0xBB && buffer[2] == 0xBF)
        return new UTF8Encoding(true); // có BOM

    // Kiểm tra pattern Shift-JIS: byte đầu trong vùng 0x81–0x9F hoặc 0xE0–0xFC
    if (bytesRead >= 2)
    {
        byte b = buffer[0];
        if ((b >= 0x81 && b <= 0x9F) || (b >= 0xE0 && b <= 0xFC))
            return Encoding.GetEncoding(932); // Shift-JIS
    }

    return new UTF8Encoding(false); // fallback UTF-8 không BOM
}

Phương pháp 2 — Đọc CSV với encoding đã xác định

public static List<string[]> ReadCsv(string filePath)
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

    var encoding = DetectEncoding(filePath);
    var rows = new List<string[]>();

    using var reader = new StreamReader(filePath, encoding);
    using var parser = new TextFieldParser(reader)
    {
        TextFieldType = FieldType.Delimited,
        HasFieldsEnclosedInQuotes = true
    };
    parser.SetDelimiters(",");

    while (!parser.EndOfData)
    {
        string[]? fields = parser.ReadFields();
        if (fields != null)
            rows.Add(fields);
    }

    return rows;
}

Phương pháp 3 — Dùng thư viện CharsetDetector (chính xác hơn)

Khi file không có BOM và khó đoán, dùng ude (Universal Charset Detector):

dotnet add package UDE.NetStandard
using UDE.Core;

public static Encoding DetectEncodingAuto(string filePath)
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

    using var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
    var detector = new CharsetDetector();
    detector.Feed(fs);
    detector.DataEnd();

    string charset = detector.Charset ?? "utf-8";
    Console.WriteLine($"Detected: {charset} (confidence: {detector.Confidence:P0})");

    return Encoding.GetEncoding(charset);
}

Ví dụ sử dụng tổng hợp

var rows = ReadCsv("data.csv");

foreach (var row in rows)
{
    foreach (var field in row)
        Console.Write($"{field}\t");
    Console.WriteLine();
}

Lưu ý quan trọng

  • Đăng ký encoding provider: Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) bắt buộc phải gọi một lần trước khi dùng Encoding.GetEncoding(932) trên .NET Core / .NET 5+. .NET Framework không cần bước này.
  • NuGet cần thiết: Microsoft.VisualBasic (nếu dùng TextFieldParser trên .NET Core), và UDE.NetStandard nếu muốn auto-detect chính xác hơn.
  • Shift-JIS vs CP932: Trong thực tế file Nhật thường là CP932 (Windows code page 932) — là superset của Shift-JIS chuẩn, nên dùng GetEncoding(932) thay vì "shift_jis".

Kết luận

Trên đây là các So sánh khả năng hỗ trợ ký tự Nhật và tiếng Việt của các encoding phổ biến.

Nếu cần kết hợp tiếng Nhật và tiếng Việt trong cùng một file, hãy dùng UTF-8 BOM (utf-8-sig) — hỗ trợ toàn bộ Unicode và Excel mở đúng encoding tự động, không cần cấu hình thêm.


Tham khảo: