python27、_winreg()不完全支持read/writeUnicode字符串到注册表

python 27, _winreg() not fully supports read/write Unicode string to registry

我按照附图做了一些测试。 test result image

我可以在 OS 上创建一个名为“新资源夹”的新文件夹。 并在注册表编辑器中手动新建一个REG_SZ,值为“新资源夹”。

但是写的是问号字符串??????通过python 27、_winreg(),我传递了一个中文unicode字符串“新资源夹”。

为什么? 如何在 EN OS 上的注册表中设置正确的中文字符串?

我的代码:

from _winreg import *
import codecs
import os
import chardet

class Reg:
    #-------------------------------------------------------------------------
    # HKEY_LOCAL_MACHINE
    #-------------------------------------------------------------------------
    def HKLM_SetReg(self, RegDir, KeyDir, KeyName, KeyValue):
        try:
            if RegDir == "x64" :
                key = OpenKey(HKEY_LOCAL_MACHINE, KeyDir, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY)
            else :
                key = OpenKey(HKEY_LOCAL_MACHINE, KeyDir, 0, KEY_ALL_ACCESS | KEY_WOW64_32KEY)
        except:
            if RegDir == "x64" :
                key = CreateKeyEx(HKEY_LOCAL_MACHINE, KeyDir, 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY)
            else: 
                key = CreateKeyEx(HKEY_LOCAL_MACHINE, KeyDir, 0, KEY_ALL_ACCESS | KEY_WOW64_32KEY)

        SetValueEx(key, KeyName, 0, REG_SZ, KeyValue)
        CloseKey(key)        

p = Reg()

s = '初めまして' # Japanese
print 'string chardet = ', chardet.detect(s)
print 'repr = ', repr(s)
print type(s)
p.HKLM_SetReg("x86", ur"SOFTWARE\test", ur"input_string", s)

s = '初めまして' # Japanese
s_decode = s.decode('utf-8') # Japanese
print 'repr = ', repr(s_decode)
print type(s_decode)
p.HKLM_SetReg("x86", ur"SOFTWARE\test", ur"input_string_decode", s_decode)

s = u"新資料夾" # zh-tw
#print chardet.detect(s)
print 'repr = ', repr(s)
print type(s)
p.HKLM_SetReg("x86", ur"SOFTWARE\test", ur"input_unicode", s)


s = u"新資料夾" # zh-tw
s_encode = s.encode('utf-8')
#print chardet.detect(s)
print 'repr = ', repr(s_encode)
print type(s_encode)
p.HKLM_SetReg("x86", ur"SOFTWARE\test", ur"input_unicode_encode", s_encode)

感谢您的帮助

莫里斯

在 Python 2.7 _winreg 中无法正确处理 Unicode。更具体地说,我认为如果字符可以编码到您的代码页中并通过 narrow windows API 传递,它将处理 unicode。但如果做不到就不行。

您可以改用 winreg_unicode 包。