首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 利用 Windows API 實現 Big5 繁體轉 GB2312 簡體

     編輯:關於C語言

前言

.NET Framework 內建編碼轉換雖支援 Big5 與 GB2312 互轉,但在某些舊版系統或特殊需求下,仍需呼叫 Windows 核心函式 LCMapString 進行更精確的繁簡轉換。本文示範如何透過 P/Invoke 呼叫 kernel32.dll 實現目錄下所有文字檔的批次繁轉簡。

核心程式碼:EncodeTool

using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;

public class EncodeTool
{
    [DllImport("kernel32.dll", EntryPoint = "LCMapStringA")]
    public static extern int LCMapString(int Locale, int dwMapFlags, byte[] lpSrcStr, int cchSrc, byte[] lpDestStr, int cchDest);

    const int LCMAP_SIMPLIFIED_CHINESE = 0x02000000;
    const int LCMAP_TRADITIONAL_CHINESE = 0x04000000;

    public static void Main(string[] args)
    {
        if (args.Length < 1)
        {
            Console.WriteLine("請指定來源目錄路徑!");
            return;
        }

        string[] files = (args.Length == 2)
            ? Directory.GetFiles(args[0], args[1])
            : Directory.GetFiles(args[0]);

        string outputDir = Path.Combine(args[0], "conv");
        if (!Directory.Exists(outputDir))
            Directory.CreateDirectory(outputDir);

        foreach (string file in files)
        {
            using (StreamReader sr = new StreamReader(file, Encoding.GetEncoding("big5")))
            {
                string content = sr.ReadToEnd();
                string converted = ConvertString(content);

                string destFile = Path.Combine(outputDir, Path.GetFileName(file));
                using (StreamWriter sw = new StreamWriter(destFile, false, Encoding.GetEncoding("gb2312")))
                {
                    sw.WriteLine(converted);
                }
                Console.WriteLine($"轉換 {file} 完成!");
            }
        }
    }

    public static string ConvertString(string input)
    {
        Encoding gb2312 = Encoding.GetEncoding(936); // GB2312 code page
        byte[] src = gb2312.GetBytes(input);
        byte[] dest = new byte[src.Length];

        // 0x0804 = zh-CN locale
        LCMapString(0x0804, LCMAP_SIMPLIFIED_CHINESE, src, -1, dest, src.Length);
        return gb2312.GetString(dest);
    }
}

關鍵技術細節

  • LCMapString 參數:Locale 設為 0x0804(中文簡體),dwMapFlags 使用 LCMAP_SIMPLIFIED_CHINESE 執行繁轉簡。
  • 編碼處理:輸入以 Big5 讀取,但轉換前先轉為 GB2312 位元組陣列,因 API 期望目標編碼的輸入。
  • 輸出編碼:寫入檔案時指定 GB2312 編碼,確保簡體字正確儲存。
  • 錯誤處理:建議加入 try-catch 捕捉檔案存取與編碼例外,生產環境務必強化。

適用場景與限制

  • 適用於大量舊版 Big5 編碼文字檔需批次轉為 GB2312 的情境。
  • 僅限 Windows 平台,依賴 kernel32.dll,跨平台專案請改用 .NET 內建 Encoding.Convert 或第三方庫(如 NConverter)。
  • 繁簡對照表為系統內建,可能無法涵蓋所有異體字或專有名詞,需人工校對。

結語

透過 P/Invoke 呼叫 Windows API,能以極少代碼實現高效能的繁簡轉換。若專案需跨平台,建議改用純 .NET 實作或成熟開源庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved