You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以指定编码(如UTF-8)读取注册表键值?

关于注册表键值编码获取的问题解答

首先得明确一个关键点:Windows注册表中的字符串类型键值(比如REG_SZ、REG_EXPAND_SZ),本质是用**UTF-16LE(小端Unicode)**格式存储的。.NET的RegistryKey.GetValue()方法在读取这些值的时候,已经自动把底层的UTF-16字节流转换成了.NET的string类型——而.NET的string本身就是基于UTF-16编码的,所以你现在代码里拿到的string其实已经是经过编码转换的结果了。

换句话说,不存在“直接以UTF-8格式从注册表读取键值”的操作,因为注册表根本没把字符串存成UTF-8。但如果你需要将读取到的字符串转换成UTF-8编码的形式(比如生成UTF-8的字节数组,或者写入UTF-8编码的文件),完全可以通过.NET的Encoding类来实现。

针对你的代码修改示例

这里给你调整一下代码,演示如何把读取到的注册表字符串转换成UTF-8格式:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;

class RegistryUtf8Example
{
    static void Main(string[] args)
    {
        string registryPath = @"Software\你的目标子键"; // 替换成实际的注册表路径
        RegistryKey targetKey = Registry.CurrentUser.OpenSubKey(registryPath);
        
        List<string> originalStrings = new List<string>();
        List<byte[]> utf8EncodedBytes = new List<byte[]>();

        if (targetKey != null)
        {
            string[] valueNames = targetKey.GetValueNames();
            foreach (string name in valueNames)
            {
                object valueData = targetKey.GetValue(name);
                // 只处理字符串类型的键值
                if (valueData is string strValue)
                {
                    originalStrings.Add(strValue);
                    // 将.NET字符串转换为UTF-8字节数组
                    byte[] utf8Bytes = Encoding.UTF8.GetBytes(strValue);
                    utf8EncodedBytes.Add(utf8Bytes);
                    
                    // 如果你需要直接写入UTF-8编码的文件,也可以这样做:
                    // System.IO.File.WriteAllText($"{name}_utf8.txt", strValue, Encoding.UTF8);
                }
            }
            targetKey.Close();
        }
    }
}

特殊情况处理:REG_BINARY类型的UTF-8数据

如果你的注册表键值是REG_BINARY类型,并且里面存储的是UTF-8编码的字节流,那读取方式就不一样了——需要先读取字节数组,再用Encoding.UTF8解码成字符串:

object valueData = targetKey.GetValue(name);
if (valueData is byte[] binaryData)
{
    string utf8String = Encoding.UTF8.GetString(binaryData);
    originalStrings.Add(utf8String);
}

总结一下:注册表的字符串值本身是UTF-16存储的,.NET读取后直接给到你兼容的string;如果需要UTF-8格式的内容,是对读取后的字符串做编码转换,而非直接从注册表读取UTF-8。

内容的提问来源于stack exchange,提问作者Lion King

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:15:02