在编辑 Windows 注册表时(如果需要的话)用哪个注册表编辑器版本启动 reg 文件?
Which Registry Editor Version to initiate reg file with when editing the Windows registry (if needed at all)?
根据 Microsoft knowledge base article 310516,应该使用
启动 .reg 文件编辑 Windows 注册表
Windows Registry Editor Version 5.00
对于 Windows 2000、Windows XP 和 Windows Server 2003
或
REGEDIT4
对于 Windows 95、Windows 98 和 Windows NT 4.0。
在 Windows 7 时,使用 Windows Registry Editor Version 5.00
启动是否正确,还是应该使用版本 6?
当 运行 一个 .bat 文件代替时,真的需要它吗?
对于当前版本,单击菜单帮助中的注册表编辑器菜单项关于注册表编辑器.
主要使用两个标准应用程序从批处理文件中处理 Windows 注册表:
- reg.exe
- regedit.exe
在 Windows x64 上既有 32 位应用程序也有 64 位应用程序,其中 32 位版本像 32 位应用程序一样访问注册表,这意味着 registry redirector 处于活动状态并且注册表项对于 64 位应用程序对于 32 位 REG 和 REGEDIT.
不可见
通常最好使用 REG 而不是 REGEDIT 来获取(读访问)或设置(写访问)批处理文件中的键或值很少。
使用 REGEDIT 自 Windows Vista 以来始终需要管理员权限,即使仅用于将密钥导出到注册表文件(读取访问权限)或从中导入数据HKEY_CURRENT_USER(简称:HKCU)的注册表文件(写入权限)。
通过使用 REG 许多操作,例如 QUERY(读取访问)或 ADD(写入access) 到 HKCU 不需要管理员权限。当然,对 HKEY_LOCAL_MACHINE(简称:HKLM)的写访问需要管理员权限以及其他不常用的操作。 运行 在命令提示符中 window reg /?
显示可用的操作。 reg query /?
和 reg add /?
在控制台中执行 window 显示在 Windows 注册表中获取(查询)或设置(添加)数据的语法和选项。
如果文件的第一行包含
,则 *.reg 文件仅在导入时被解释为具有有效注册表数据的文件
- REGEDIT4
或
- Windows 注册表编辑器版本 5.00
这不是注册表编辑器的版本或 Windows 版本。它是文件本身中注册表数据格式的版本信息。所以它是一个注册表文件格式版本。注册表文件的第一行 必须 具有这两个字符串之一。
在没有此 header 行的情况下尝试导入 *.reg 文件会导致错误。
Windows 2000(还有 regedt32.exe)和更高版本的 Windows 支持两种格式版本 4 和 5 的注册表文件.
Windows 95、98、Millennium 和 NT4 仅支持格式 4 的注册表文件。
所以现在(2016 年)主要取决于注册表文件使用哪种格式的数据。
主要区别是支持encoding文本数据
格式为 REGEDIT4 的注册表文件只能是文本文件,每个字符 1 个字节,使用代码值大于 255(十进制,0xFF 十六进制)的 code page defined in Windows Locales and Languages settings for non Unicode aware applications which is Windows-1252 for North American and Western European countries. Therefore registry files in format REGEDIT4 cannot contain Unicode 个字符.
Windows 注册表编辑器版本 5.00 格式的注册表文件支持根据 Unicode standard. Therefore *.reg files in format Windows Registry Editor Version 5.00 are created by REGEDIT as UTF-16 Little Endian encoded text files with Byte Order Mark (FF FE) 每个字符多于 1 个字节编码的文本。
因此,如果要导入/导出的数据是二进制数据或仅使用 ASCII 个字符(代码值 < 十进制 128)的文本,作为所有注册表数据的 99.99%,使用哪种文件格式并不重要。
对于非 ASCII 字符,知道 Windows 命令解释器使用哪个代码页已经很重要,因为这通常是 OEM 代码页,如 code page 437 (US, Canada) or code page 850(西欧)不同于 GUI代码页 Windows-1252。 运行 在命令提示符中 window chcp
或 mode con
输出当前计算机上由 Windows 命令解释器用于控制台的默认代码页。
如果确实需要支持 Unicode 字符串,则需要使用格式 Windows Registry Editor Version 5.00.
让我们看一个假设的 Unicode 示例:
在 Windows 注册表中,键 HKCU\RegFormat
下定义了两个 Unicode 字符串:
类型为 REG_SZ
的字符串,名称为 Two Not Equal 3
,Unicode 字符串值为:
2 ≠ 3
类型为 REG_MULTI_SZ
的 multi-line 字符串,名称为 Formulas
,Unicode 字符串值为:
2 µs × 3 = 6 µs
A = π × r²
有关注册表值类型的详细信息,请参阅 Microsoft 文章 Registry Value Types, Distributing Registry Changes and Data Types in the Registry。
导出密钥 HKCU\RegFormat
格式 Windows 注册表编辑器版本 5.00 是自 Windows 2000 以来的标准格式导致 UTF-16 LE 编码文本文件,596 字节,内容:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\RegFormat]
"Two Not Equal 3"="2 ≠ 3"
"Formulas"=hex(7):32,00,20,00,b5,00,73,00,20,00,d7,00,20,00,33,00,20,00,3d,00,\
20,00,36,00,20,00,b5,00,73,00,00,00,41,00,20,00,3d,00,20,00,c0,03,20,00,d7,\
00,20,00,72,00,b2,00,00,00,00,00
这个文件的字节流以十六进制显示viewer/editor为:
00000000h: FF FE 57 00 69 00 6E 00 64 00 6F 00 77 00 73 00 ; ÿþW.i.n.d.o.w.s.
00000010h: 20 00 52 00 65 00 67 00 69 00 73 00 74 00 72 00 ; .R.e.g.i.s.t.r.
00000020h: 79 00 20 00 45 00 64 00 69 00 74 00 6F 00 72 00 ; y. .E.d.i.t.o.r.
00000030h: 20 00 56 00 65 00 72 00 73 00 69 00 6F 00 6E 00 ; .V.e.r.s.i.o.n.
00000040h: 20 00 35 00 2E 00 30 00 30 00 0D 00 0A 00 0D 00 ; .5...0.0.......
00000050h: 0A 00 5B 00 48 00 4B 00 45 00 59 00 5F 00 43 00 ; ..[.H.K.E.Y._.C.
00000060h: 55 00 52 00 52 00 45 00 4E 00 54 00 5F 00 55 00 ; U.R.R.E.N.T._.U.
00000070h: 53 00 45 00 52 00 5C 00 52 00 65 00 67 00 46 00 ; S.E.R.\.R.e.g.F.
00000080h: 6F 00 72 00 6D 00 61 00 74 00 5D 00 0D 00 0A 00 ; o.r.m.a.t.].....
00000090h: 22 00 54 00 77 00 6F 00 20 00 4E 00 6F 00 74 00 ; ".T.w.o. .N.o.t.
000000a0h: 20 00 45 00 71 00 75 00 61 00 6C 00 20 00 33 00 ; .E.q.u.a.l. .3.
000000b0h: 22 00 3D 00 22 00 32 00 20 00 60 22 20 00 33 00 ; ".=.".2. .`" .3.
000000c0h: 22 00 0D 00 0A 00 22 00 46 00 6F 00 72 00 6D 00 ; ".....".F.o.r.m.
000000d0h: 75 00 6C 00 61 00 73 00 22 00 3D 00 68 00 65 00 ; u.l.a.s.".=.h.e.
000000e0h: 78 00 28 00 37 00 29 00 3A 00 33 00 32 00 2C 00 ; x.(.7.).:.3.2.,.
000000f0h: 30 00 30 00 2C 00 32 00 30 00 2C 00 30 00 30 00 ; 0.0.,.2.0.,.0.0.
00000100h: 2C 00 62 00 35 00 2C 00 30 00 30 00 2C 00 37 00 ; ,.b.5.,.0.0.,.7.
00000110h: 33 00 2C 00 30 00 30 00 2C 00 32 00 30 00 2C 00 ; 3.,.0.0.,.2.0.,.
00000120h: 30 00 30 00 2C 00 64 00 37 00 2C 00 30 00 30 00 ; 0.0.,.d.7.,.0.0.
00000130h: 2C 00 32 00 30 00 2C 00 30 00 30 00 2C 00 33 00 ; ,.2.0.,.0.0.,.3.
00000140h: 33 00 2C 00 30 00 30 00 2C 00 32 00 30 00 2C 00 ; 3.,.0.0.,.2.0.,.
00000150h: 30 00 30 00 2C 00 33 00 64 00 2C 00 30 00 30 00 ; 0.0.,.3.d.,.0.0.
00000160h: 2C 00 5C 00 0D 00 0A 00 20 00 20 00 32 00 30 00 ; ,.\..... . .2.0.
00000170h: 2C 00 30 00 30 00 2C 00 33 00 36 00 2C 00 30 00 ; ,.0.0.,.3.6.,.0.
00000180h: 30 00 2C 00 32 00 30 00 2C 00 30 00 30 00 2C 00 ; 0.,.2.0.,.0.0.,.
00000190h: 62 00 35 00 2C 00 30 00 30 00 2C 00 37 00 33 00 ; b.5.,.0.0.,.7.3.
000001a0h: 2C 00 30 00 30 00 2C 00 30 00 30 00 2C 00 30 00 ; ,.0.0.,.0.0.,.0.
000001b0h: 30 00 2C 00 34 00 31 00 2C 00 30 00 30 00 2C 00 ; 0.,.4.1.,.0.0.,.
000001c0h: 32 00 30 00 2C 00 30 00 30 00 2C 00 33 00 64 00 ; 2.0.,.0.0.,.3.d.
000001d0h: 2C 00 30 00 30 00 2C 00 32 00 30 00 2C 00 30 00 ; ,.0.0.,.2.0.,.0.
000001e0h: 30 00 2C 00 63 00 30 00 2C 00 30 00 33 00 2C 00 ; 0.,.c.0.,.0.3.,.
000001f0h: 32 00 30 00 2C 00 30 00 30 00 2C 00 64 00 37 00 ; 2.0.,.0.0.,.d.7.
00000200h: 2C 00 5C 00 0D 00 0A 00 20 00 20 00 30 00 30 00 ; ,.\..... . .0.0.
00000210h: 2C 00 32 00 30 00 2C 00 30 00 30 00 2C 00 37 00 ; ,.2.0.,.0.0.,.7.
00000220h: 32 00 2C 00 30 00 30 00 2C 00 62 00 32 00 2C 00 ; 2.,.0.0.,.b.2.,.
00000230h: 30 00 30 00 2C 00 30 00 30 00 2C 00 30 00 30 00 ; 0.0.,.0.0.,.0.0.
00000240h: 2C 00 30 00 30 00 2C 00 30 00 30 00 0D 00 0A 00 ; ,.0.0.,.0.0.....
00000250h: 0D 00 0A 00 ; ....
与代码页 Windows-1252 一起显示的前 2 个字节作为 ÿþ
是 UTF-16 LE BOM 的两个字节,文本编辑器在文本编辑模式下不显示它们。
但是通过点击导出对话框中的文件类型下拉列表并选择Win9x/NT4 注册表文件 生成一个 ANSI(更精确:Windows-1252)编码的文本文件,只有 180 个字节,内容为:
REGEDIT4
[HKEY_CURRENT_USER\RegFormat]
"Two Not Equal 3"="2 ? 3"
"Formulas"=hex(7):32,20,b5,73,20,d7,20,33,20,3d,20,36,20,b5,73,00,41,20,3d,20,\
c0,20,d7,20,72,b2,00,00
这个文件的字节流以十六进制显示viewer/editor为:
00000000h: 52 45 47 45 44 49 54 34 0D 0A 0D 0A 5B 48 4B 45 ; REGEDIT4....[HKE
00000010h: 59 5F 43 55 52 52 45 4E 54 5F 55 53 45 52 5C 52 ; Y_CURRENT_USER\R
00000020h: 65 67 46 6F 72 6D 61 74 5D 0D 0A 22 54 77 6F 20 ; egFormat].."Two
00000030h: 4E 6F 74 20 45 71 75 61 6C 20 33 22 3D 22 32 20 ; Not Equal 3"="2
00000040h: 3F 20 33 22 0D 0A 22 46 6F 72 6D 75 6C 61 73 22 ; ? 3".."Formulas"
00000050h: 3D 68 65 78 28 37 29 3A 33 32 2C 32 30 2C 62 35 ; =hex(7):32,20,b5
00000060h: 2C 37 33 2C 32 30 2C 64 37 2C 32 30 2C 33 33 2C ; ,73,20,d7,20,33,
00000070h: 32 30 2C 33 64 2C 32 30 2C 33 36 2C 32 30 2C 62 ; 20,3d,20,36,20,b
00000080h: 35 2C 37 33 2C 30 30 2C 34 31 2C 32 30 2C 33 64 ; 5,73,00,41,20,3d
00000090h: 2C 32 30 2C 5C 0D 0A 20 20 63 30 2C 32 30 2C 64 ; ,20,\.. c0,20,d
000000a0h: 37 2C 32 30 2C 37 32 2C 62 32 2C 30 30 2C 30 30 ; 7,20,72,b2,00,00
000000b0h: 0D 0A 0D 0A ; ....
有什么区别?
REGEDIT首先将REG_SZ类型的字符串从Unicode转为代码页Windows-1252,然后导出数据。结果是字符 ?
而不是 not equal sign,Unicode 值 U+2260 在类型 REG_SZ
的字符串中,因为此字符在代码页 Windows-1252 中不可用。
multi-line 字符串只有一半的十六进制值(每个字符只有 1 个字节,而不是每个字符 2 个字节)。
具有 Unicode 值 U+03C0 的 small PI 以值 C0(只是低字节)存储,因此现在是字符 À
,因为此字符的代码值为 0xC0在代码页 Windows-1252.
从 Windows 注册表编辑器版本 5.00 格式的文件中导入数据会导致在 Windows 注册表中获得与以前相同的数据。
但是从格式为 REGEDIT4 的文件中导入数据会导致:
类型为 REG_SZ
的字符串,名称为 Two Not Equal 3
,ANSI 字符串值为:
2 ? 3
类型为 REG_MULTI_SZ
的 multi-line 字符串,名称为 Formulas
,Unicode 字符串值为:
2 µs × 3 = 6 µs
A = À × r²
字符 µ
和 ×
以及 ²
的代码值小于 255(十进制),因此也可以正确存储在 格式的注册表文件中REGEDIT4。但是 ≠
和 π
不能正确编码为格式 4.
Windows 注册表编辑器版本 5.00 格式的注册表文件本身不能是 Unicode 编码的文本文件。也可以有一个 Windows-1252 编码的注册表文件,其内容为:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\RegFormat]
"Two Not Equal 3"=hex(1):32,00,60,22,33,00
"Formulas"=hex(7):32,00,20,00,b5,00,73,00,20,00,d7,00,20,00,33,00,20,00,3d,00,\
20,00,36,00,20,00,b5,00,73,00,00,00,41,00,20,00,3d,00,20,00,c0,03,20,00,d7,\
00,20,00,72,00,b2,00,00,00,00,00
十六进制显示viewer/editor为:
00000000h: 57 69 6E 64 6F 77 73 20 52 65 67 69 73 74 72 79 ; Windows Registry
00000010h: 20 45 64 69 74 6F 72 20 56 65 72 73 69 6F 6E 20 ; Editor Version
00000020h: 35 2E 30 30 0D 0A 0D 0A 5B 48 4B 45 59 5F 43 55 ; 5.00....[HKEY_CU
00000030h: 52 52 45 4E 54 5F 55 53 45 52 5C 52 65 67 46 6F ; RRENT_USER\RegFo
00000040h: 72 6D 61 74 5D 0D 0A 22 54 77 6F 20 4E 6F 74 20 ; rmat].."Two Not
00000050h: 45 71 75 61 6C 20 33 22 3D 68 65 78 28 31 29 3A ; Equal 3"=hex(1):
00000060h: 33 32 2C 30 30 2C 36 30 2C 32 32 2C 33 33 2C 30 ; 32,00,60,22,33,0
00000070h: 30 0D 0A 22 46 6F 72 6D 75 6C 61 73 22 3D 68 65 ; 0.."Formulas"=he
00000080h: 78 28 37 29 3A 33 32 2C 30 30 2C 32 30 2C 30 30 ; x(7):32,00,20,00
00000090h: 2C 62 35 2C 30 30 2C 37 33 2C 30 30 2C 32 30 2C ; ,b5,00,73,00,20,
000000a0h: 30 30 2C 64 37 2C 30 30 2C 32 30 2C 30 30 2C 33 ; 00,d7,00,20,00,3
000000b0h: 33 2C 30 30 2C 32 30 2C 30 30 2C 33 64 2C 30 30 ; 3,00,20,00,3d,00
000000c0h: 2C 5C 0D 0A 20 20 32 30 2C 30 30 2C 33 36 2C 30 ; ,\.. 20,00,36,0
000000d0h: 30 2C 32 30 2C 30 30 2C 62 35 2C 30 30 2C 37 33 ; 0,20,00,b5,00,73
000000e0h: 2C 30 30 2C 30 30 2C 30 30 2C 34 31 2C 30 30 2C ; ,00,00,00,41,00,
000000f0h: 32 30 2C 30 30 2C 33 64 2C 30 30 2C 32 30 2C 30 ; 20,00,3d,00,20,0
00000100h: 30 2C 63 30 2C 30 33 2C 32 30 2C 30 30 2C 64 37 ; 0,c0,03,20,00,d7
00000110h: 2C 5C 0D 0A 20 20 30 30 2C 32 30 2C 30 30 2C 37 ; ,\.. 00,20,00,7
00000120h: 32 2C 30 30 2C 62 32 2C 30 30 2C 30 30 2C 30 30 ; 2,00,b2,00,00,00
00000130h: 2C 30 30 2C 30 30 0D 0A 0D 0A ; ,00,00....
导入此注册表文件仍然会在 Windows 注册表中生成 Unicode 字符串:
2 ≠ 3
2 µs × 3 = 6 µs
A = À × r²
对 REG_SZ
类型的值使用二进制表示 hex(1)
是不标准的。这个例子是我手动创建的,以演示可以导入类型为 REG_SZ
的 Unicode 字符串,也可以使用非 Unicode 编码的注册表文件,这更容易从批处理文件中生成。
但是如果key或value的name自身包含一个编码值大于U+00FF的Unicode字符,那么就真的需要使用注册表文件格式Windows 注册表编辑器版本 5.00,注册表文件也使用 little-endian 格式的 16 位 Unicode 转换格式进行了 Unicode 编码。
参见函数 SHRegWriteUSValue for hex(?) ... REG_? 注册表类型 table.
顺便说一句:我曾经写过一次 UltraEdit 脚本 GetStringFromRegHex.js 来获取类型 hex(2)
... REG_EXPAND_SZ
和 hex(7)
... REG_MULTI_SZ
在文本编辑器 UltraEdit 中打开的注册表文件中选择显示为文本,因为十六进制值对于人类来说真的很难“作为文本阅读”。
命令行
%SystemRoot%\System32\regedit.exe /a /e "%USERPROFILE%\Desktop\EntireWindowsRegistry.reg"
使用注册表文件格式 4 将整个 Windows 注册表导出到 Windows 桌面 Windows
不带选项 /a
的同一命令行会导致使用注册表文件格式 5 以 Unicode 格式导出整个 Windows 注册表。
根据 Microsoft knowledge base article 310516,应该使用
启动 .reg 文件编辑 Windows 注册表Windows Registry Editor Version 5.00
对于 Windows 2000、Windows XP 和 Windows Server 2003
或REGEDIT4
对于 Windows 95、Windows 98 和 Windows NT 4.0。
在 Windows 7 时,使用 Windows Registry Editor Version 5.00
启动是否正确,还是应该使用版本 6?
当 运行 一个 .bat 文件代替时,真的需要它吗?
对于当前版本,单击菜单帮助中的注册表编辑器菜单项关于注册表编辑器.
主要使用两个标准应用程序从批处理文件中处理 Windows 注册表:
- reg.exe
- regedit.exe
在 Windows x64 上既有 32 位应用程序也有 64 位应用程序,其中 32 位版本像 32 位应用程序一样访问注册表,这意味着 registry redirector 处于活动状态并且注册表项对于 64 位应用程序对于 32 位 REG 和 REGEDIT.
不可见通常最好使用 REG 而不是 REGEDIT 来获取(读访问)或设置(写访问)批处理文件中的键或值很少。
使用 REGEDIT 自 Windows Vista 以来始终需要管理员权限,即使仅用于将密钥导出到注册表文件(读取访问权限)或从中导入数据HKEY_CURRENT_USER(简称:HKCU)的注册表文件(写入权限)。
通过使用 REG 许多操作,例如 QUERY(读取访问)或 ADD(写入access) 到 HKCU 不需要管理员权限。当然,对 HKEY_LOCAL_MACHINE(简称:HKLM)的写访问需要管理员权限以及其他不常用的操作。 运行 在命令提示符中 window reg /?
显示可用的操作。 reg query /?
和 reg add /?
在控制台中执行 window 显示在 Windows 注册表中获取(查询)或设置(添加)数据的语法和选项。
如果文件的第一行包含
,则 *.reg 文件仅在导入时被解释为具有有效注册表数据的文件- REGEDIT4
或 - Windows 注册表编辑器版本 5.00
这不是注册表编辑器的版本或 Windows 版本。它是文件本身中注册表数据格式的版本信息。所以它是一个注册表文件格式版本。注册表文件的第一行 必须 具有这两个字符串之一。
在没有此 header 行的情况下尝试导入 *.reg 文件会导致错误。
Windows 2000(还有 regedt32.exe)和更高版本的 Windows 支持两种格式版本 4 和 5 的注册表文件.
Windows 95、98、Millennium 和 NT4 仅支持格式 4 的注册表文件。
所以现在(2016 年)主要取决于注册表文件使用哪种格式的数据。
主要区别是支持encoding文本数据
格式为 REGEDIT4 的注册表文件只能是文本文件,每个字符 1 个字节,使用代码值大于 255(十进制,0xFF 十六进制)的 code page defined in Windows Locales and Languages settings for non Unicode aware applications which is Windows-1252 for North American and Western European countries. Therefore registry files in format REGEDIT4 cannot contain Unicode 个字符.
Windows 注册表编辑器版本 5.00 格式的注册表文件支持根据 Unicode standard. Therefore *.reg files in format Windows Registry Editor Version 5.00 are created by REGEDIT as UTF-16 Little Endian encoded text files with Byte Order Mark (FF FE) 每个字符多于 1 个字节编码的文本。
因此,如果要导入/导出的数据是二进制数据或仅使用 ASCII 个字符(代码值 < 十进制 128)的文本,作为所有注册表数据的 99.99%,使用哪种文件格式并不重要。
对于非 ASCII 字符,知道 Windows 命令解释器使用哪个代码页已经很重要,因为这通常是 OEM 代码页,如 code page 437 (US, Canada) or code page 850(西欧)不同于 GUI代码页 Windows-1252。 运行 在命令提示符中 window chcp
或 mode con
输出当前计算机上由 Windows 命令解释器用于控制台的默认代码页。
如果确实需要支持 Unicode 字符串,则需要使用格式 Windows Registry Editor Version 5.00.
让我们看一个假设的 Unicode 示例:
在 Windows 注册表中,键 HKCU\RegFormat
下定义了两个 Unicode 字符串:
类型为
REG_SZ
的字符串,名称为Two Not Equal 3
,Unicode 字符串值为:2 ≠ 3
类型为
REG_MULTI_SZ
的 multi-line 字符串,名称为Formulas
,Unicode 字符串值为:2 µs × 3 = 6 µs
A = π × r²
有关注册表值类型的详细信息,请参阅 Microsoft 文章 Registry Value Types, Distributing Registry Changes and Data Types in the Registry。
导出密钥 HKCU\RegFormat
格式 Windows 注册表编辑器版本 5.00 是自 Windows 2000 以来的标准格式导致 UTF-16 LE 编码文本文件,596 字节,内容:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\RegFormat]
"Two Not Equal 3"="2 ≠ 3"
"Formulas"=hex(7):32,00,20,00,b5,00,73,00,20,00,d7,00,20,00,33,00,20,00,3d,00,\
20,00,36,00,20,00,b5,00,73,00,00,00,41,00,20,00,3d,00,20,00,c0,03,20,00,d7,\
00,20,00,72,00,b2,00,00,00,00,00
这个文件的字节流以十六进制显示viewer/editor为:
00000000h: FF FE 57 00 69 00 6E 00 64 00 6F 00 77 00 73 00 ; ÿþW.i.n.d.o.w.s.
00000010h: 20 00 52 00 65 00 67 00 69 00 73 00 74 00 72 00 ; .R.e.g.i.s.t.r.
00000020h: 79 00 20 00 45 00 64 00 69 00 74 00 6F 00 72 00 ; y. .E.d.i.t.o.r.
00000030h: 20 00 56 00 65 00 72 00 73 00 69 00 6F 00 6E 00 ; .V.e.r.s.i.o.n.
00000040h: 20 00 35 00 2E 00 30 00 30 00 0D 00 0A 00 0D 00 ; .5...0.0.......
00000050h: 0A 00 5B 00 48 00 4B 00 45 00 59 00 5F 00 43 00 ; ..[.H.K.E.Y._.C.
00000060h: 55 00 52 00 52 00 45 00 4E 00 54 00 5F 00 55 00 ; U.R.R.E.N.T._.U.
00000070h: 53 00 45 00 52 00 5C 00 52 00 65 00 67 00 46 00 ; S.E.R.\.R.e.g.F.
00000080h: 6F 00 72 00 6D 00 61 00 74 00 5D 00 0D 00 0A 00 ; o.r.m.a.t.].....
00000090h: 22 00 54 00 77 00 6F 00 20 00 4E 00 6F 00 74 00 ; ".T.w.o. .N.o.t.
000000a0h: 20 00 45 00 71 00 75 00 61 00 6C 00 20 00 33 00 ; .E.q.u.a.l. .3.
000000b0h: 22 00 3D 00 22 00 32 00 20 00 60 22 20 00 33 00 ; ".=.".2. .`" .3.
000000c0h: 22 00 0D 00 0A 00 22 00 46 00 6F 00 72 00 6D 00 ; ".....".F.o.r.m.
000000d0h: 75 00 6C 00 61 00 73 00 22 00 3D 00 68 00 65 00 ; u.l.a.s.".=.h.e.
000000e0h: 78 00 28 00 37 00 29 00 3A 00 33 00 32 00 2C 00 ; x.(.7.).:.3.2.,.
000000f0h: 30 00 30 00 2C 00 32 00 30 00 2C 00 30 00 30 00 ; 0.0.,.2.0.,.0.0.
00000100h: 2C 00 62 00 35 00 2C 00 30 00 30 00 2C 00 37 00 ; ,.b.5.,.0.0.,.7.
00000110h: 33 00 2C 00 30 00 30 00 2C 00 32 00 30 00 2C 00 ; 3.,.0.0.,.2.0.,.
00000120h: 30 00 30 00 2C 00 64 00 37 00 2C 00 30 00 30 00 ; 0.0.,.d.7.,.0.0.
00000130h: 2C 00 32 00 30 00 2C 00 30 00 30 00 2C 00 33 00 ; ,.2.0.,.0.0.,.3.
00000140h: 33 00 2C 00 30 00 30 00 2C 00 32 00 30 00 2C 00 ; 3.,.0.0.,.2.0.,.
00000150h: 30 00 30 00 2C 00 33 00 64 00 2C 00 30 00 30 00 ; 0.0.,.3.d.,.0.0.
00000160h: 2C 00 5C 00 0D 00 0A 00 20 00 20 00 32 00 30 00 ; ,.\..... . .2.0.
00000170h: 2C 00 30 00 30 00 2C 00 33 00 36 00 2C 00 30 00 ; ,.0.0.,.3.6.,.0.
00000180h: 30 00 2C 00 32 00 30 00 2C 00 30 00 30 00 2C 00 ; 0.,.2.0.,.0.0.,.
00000190h: 62 00 35 00 2C 00 30 00 30 00 2C 00 37 00 33 00 ; b.5.,.0.0.,.7.3.
000001a0h: 2C 00 30 00 30 00 2C 00 30 00 30 00 2C 00 30 00 ; ,.0.0.,.0.0.,.0.
000001b0h: 30 00 2C 00 34 00 31 00 2C 00 30 00 30 00 2C 00 ; 0.,.4.1.,.0.0.,.
000001c0h: 32 00 30 00 2C 00 30 00 30 00 2C 00 33 00 64 00 ; 2.0.,.0.0.,.3.d.
000001d0h: 2C 00 30 00 30 00 2C 00 32 00 30 00 2C 00 30 00 ; ,.0.0.,.2.0.,.0.
000001e0h: 30 00 2C 00 63 00 30 00 2C 00 30 00 33 00 2C 00 ; 0.,.c.0.,.0.3.,.
000001f0h: 32 00 30 00 2C 00 30 00 30 00 2C 00 64 00 37 00 ; 2.0.,.0.0.,.d.7.
00000200h: 2C 00 5C 00 0D 00 0A 00 20 00 20 00 30 00 30 00 ; ,.\..... . .0.0.
00000210h: 2C 00 32 00 30 00 2C 00 30 00 30 00 2C 00 37 00 ; ,.2.0.,.0.0.,.7.
00000220h: 32 00 2C 00 30 00 30 00 2C 00 62 00 32 00 2C 00 ; 2.,.0.0.,.b.2.,.
00000230h: 30 00 30 00 2C 00 30 00 30 00 2C 00 30 00 30 00 ; 0.0.,.0.0.,.0.0.
00000240h: 2C 00 30 00 30 00 2C 00 30 00 30 00 0D 00 0A 00 ; ,.0.0.,.0.0.....
00000250h: 0D 00 0A 00 ; ....
与代码页 Windows-1252 一起显示的前 2 个字节作为 ÿþ
是 UTF-16 LE BOM 的两个字节,文本编辑器在文本编辑模式下不显示它们。
但是通过点击导出对话框中的文件类型下拉列表并选择Win9x/NT4 注册表文件 生成一个 ANSI(更精确:Windows-1252)编码的文本文件,只有 180 个字节,内容为:
REGEDIT4
[HKEY_CURRENT_USER\RegFormat]
"Two Not Equal 3"="2 ? 3"
"Formulas"=hex(7):32,20,b5,73,20,d7,20,33,20,3d,20,36,20,b5,73,00,41,20,3d,20,\
c0,20,d7,20,72,b2,00,00
这个文件的字节流以十六进制显示viewer/editor为:
00000000h: 52 45 47 45 44 49 54 34 0D 0A 0D 0A 5B 48 4B 45 ; REGEDIT4....[HKE
00000010h: 59 5F 43 55 52 52 45 4E 54 5F 55 53 45 52 5C 52 ; Y_CURRENT_USER\R
00000020h: 65 67 46 6F 72 6D 61 74 5D 0D 0A 22 54 77 6F 20 ; egFormat].."Two
00000030h: 4E 6F 74 20 45 71 75 61 6C 20 33 22 3D 22 32 20 ; Not Equal 3"="2
00000040h: 3F 20 33 22 0D 0A 22 46 6F 72 6D 75 6C 61 73 22 ; ? 3".."Formulas"
00000050h: 3D 68 65 78 28 37 29 3A 33 32 2C 32 30 2C 62 35 ; =hex(7):32,20,b5
00000060h: 2C 37 33 2C 32 30 2C 64 37 2C 32 30 2C 33 33 2C ; ,73,20,d7,20,33,
00000070h: 32 30 2C 33 64 2C 32 30 2C 33 36 2C 32 30 2C 62 ; 20,3d,20,36,20,b
00000080h: 35 2C 37 33 2C 30 30 2C 34 31 2C 32 30 2C 33 64 ; 5,73,00,41,20,3d
00000090h: 2C 32 30 2C 5C 0D 0A 20 20 63 30 2C 32 30 2C 64 ; ,20,\.. c0,20,d
000000a0h: 37 2C 32 30 2C 37 32 2C 62 32 2C 30 30 2C 30 30 ; 7,20,72,b2,00,00
000000b0h: 0D 0A 0D 0A ; ....
有什么区别?
REGEDIT首先将REG_SZ类型的字符串从Unicode转为代码页Windows-1252,然后导出数据。结果是字符
?
而不是 not equal sign,Unicode 值 U+2260 在类型REG_SZ
的字符串中,因为此字符在代码页 Windows-1252 中不可用。multi-line 字符串只有一半的十六进制值(每个字符只有 1 个字节,而不是每个字符 2 个字节)。
具有 Unicode 值 U+03C0 的 small PI 以值 C0(只是低字节)存储,因此现在是字符
À
,因为此字符的代码值为 0xC0在代码页 Windows-1252.
从 Windows 注册表编辑器版本 5.00 格式的文件中导入数据会导致在 Windows 注册表中获得与以前相同的数据。
但是从格式为 REGEDIT4 的文件中导入数据会导致:
类型为
REG_SZ
的字符串,名称为Two Not Equal 3
,ANSI 字符串值为:2 ? 3
类型为
REG_MULTI_SZ
的 multi-line 字符串,名称为Formulas
,Unicode 字符串值为:2 µs × 3 = 6 µs
A = À × r²
字符 µ
和 ×
以及 ²
的代码值小于 255(十进制),因此也可以正确存储在 格式的注册表文件中REGEDIT4。但是 ≠
和 π
不能正确编码为格式 4.
Windows 注册表编辑器版本 5.00 格式的注册表文件本身不能是 Unicode 编码的文本文件。也可以有一个 Windows-1252 编码的注册表文件,其内容为:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\RegFormat]
"Two Not Equal 3"=hex(1):32,00,60,22,33,00
"Formulas"=hex(7):32,00,20,00,b5,00,73,00,20,00,d7,00,20,00,33,00,20,00,3d,00,\
20,00,36,00,20,00,b5,00,73,00,00,00,41,00,20,00,3d,00,20,00,c0,03,20,00,d7,\
00,20,00,72,00,b2,00,00,00,00,00
十六进制显示viewer/editor为:
00000000h: 57 69 6E 64 6F 77 73 20 52 65 67 69 73 74 72 79 ; Windows Registry
00000010h: 20 45 64 69 74 6F 72 20 56 65 72 73 69 6F 6E 20 ; Editor Version
00000020h: 35 2E 30 30 0D 0A 0D 0A 5B 48 4B 45 59 5F 43 55 ; 5.00....[HKEY_CU
00000030h: 52 52 45 4E 54 5F 55 53 45 52 5C 52 65 67 46 6F ; RRENT_USER\RegFo
00000040h: 72 6D 61 74 5D 0D 0A 22 54 77 6F 20 4E 6F 74 20 ; rmat].."Two Not
00000050h: 45 71 75 61 6C 20 33 22 3D 68 65 78 28 31 29 3A ; Equal 3"=hex(1):
00000060h: 33 32 2C 30 30 2C 36 30 2C 32 32 2C 33 33 2C 30 ; 32,00,60,22,33,0
00000070h: 30 0D 0A 22 46 6F 72 6D 75 6C 61 73 22 3D 68 65 ; 0.."Formulas"=he
00000080h: 78 28 37 29 3A 33 32 2C 30 30 2C 32 30 2C 30 30 ; x(7):32,00,20,00
00000090h: 2C 62 35 2C 30 30 2C 37 33 2C 30 30 2C 32 30 2C ; ,b5,00,73,00,20,
000000a0h: 30 30 2C 64 37 2C 30 30 2C 32 30 2C 30 30 2C 33 ; 00,d7,00,20,00,3
000000b0h: 33 2C 30 30 2C 32 30 2C 30 30 2C 33 64 2C 30 30 ; 3,00,20,00,3d,00
000000c0h: 2C 5C 0D 0A 20 20 32 30 2C 30 30 2C 33 36 2C 30 ; ,\.. 20,00,36,0
000000d0h: 30 2C 32 30 2C 30 30 2C 62 35 2C 30 30 2C 37 33 ; 0,20,00,b5,00,73
000000e0h: 2C 30 30 2C 30 30 2C 30 30 2C 34 31 2C 30 30 2C ; ,00,00,00,41,00,
000000f0h: 32 30 2C 30 30 2C 33 64 2C 30 30 2C 32 30 2C 30 ; 20,00,3d,00,20,0
00000100h: 30 2C 63 30 2C 30 33 2C 32 30 2C 30 30 2C 64 37 ; 0,c0,03,20,00,d7
00000110h: 2C 5C 0D 0A 20 20 30 30 2C 32 30 2C 30 30 2C 37 ; ,\.. 00,20,00,7
00000120h: 32 2C 30 30 2C 62 32 2C 30 30 2C 30 30 2C 30 30 ; 2,00,b2,00,00,00
00000130h: 2C 30 30 2C 30 30 0D 0A 0D 0A ; ,00,00....
导入此注册表文件仍然会在 Windows 注册表中生成 Unicode 字符串:
2 ≠ 3
2 µs × 3 = 6 µs
A = À × r²
对 REG_SZ
类型的值使用二进制表示 hex(1)
是不标准的。这个例子是我手动创建的,以演示可以导入类型为 REG_SZ
的 Unicode 字符串,也可以使用非 Unicode 编码的注册表文件,这更容易从批处理文件中生成。
但是如果key或value的name自身包含一个编码值大于U+00FF的Unicode字符,那么就真的需要使用注册表文件格式Windows 注册表编辑器版本 5.00,注册表文件也使用 little-endian 格式的 16 位 Unicode 转换格式进行了 Unicode 编码。
参见函数 SHRegWriteUSValue for hex(?) ... REG_? 注册表类型 table.
顺便说一句:我曾经写过一次 UltraEdit 脚本 GetStringFromRegHex.js 来获取类型 hex(2)
... REG_EXPAND_SZ
和 hex(7)
... REG_MULTI_SZ
在文本编辑器 UltraEdit 中打开的注册表文件中选择显示为文本,因为十六进制值对于人类来说真的很难“作为文本阅读”。
命令行
%SystemRoot%\System32\regedit.exe /a /e "%USERPROFILE%\Desktop\EntireWindowsRegistry.reg"
使用注册表文件格式 4 将整个 Windows 注册表导出到 Windows 桌面 Windows
不带选项 /a
的同一命令行会导致使用注册表文件格式 5 以 Unicode 格式导出整个 Windows 注册表。