通过安装脚本/ Windows批处理/ Power Shell是否有办法在传递文件进行转换之前检查文件是否为UTF-8?
作为背景,我目前正在研究使用Visual Studio 2005(升级为Visual Studio 2017)和C ++开发的旧版(日语)Windows软件。
我正在处理使GUI能够显示和输入汉字的要求。因此,决定使用UNICODE进行项目/解决方案编码。
由于该项目最初使用的是Multibyte,为了与UNICODE向后兼容,我决定以UTF-8编码配置文件(ini,dat,保存文件),因为这些文件也被Web应用程序引用。
该软件的主要部分现已完成并且可以使用,最后一个问题是-推出版本升级安装程序。
在此安装程序中(使用Install脚本),我需要将保存文件(以前以SHIFT-JIS编码,因为这些保存文件包含日语文本)更新为UTF-8。
我已经在以下几行中创建了一个批处理文件,该文件将SHIFT-JIS转换为UTF-8,该文件在安装程序的最后部分被调用,并在转换后被删除。
@echo off
:Shift_JIS -> UTF-8
setlocal enabledelayedexpansion
for %%f in ("%~dp0\savedfiles\*.sav") do (
echo %%~ff| findstr /l /e /i ".sav"
if !ERRORLEVEL! equ 0 (
powershell -nop -c "&{[IO.File]::WriteAllText($args[1], [IO.File]::ReadAllText($args[0], [Text.Encoding]::GetEncoding(932)))}" \"%%~ff" \"%%~ff"
)
)
但是,与此有关的问题是,当用户(1)升级,(2)卸载(故意遗留.sav文件)和(3)重新安装软件时,保存文件会被双重重新编码并导致软件崩溃。 ((1)升级期间更新了UTF-8日语字符,(3)重新安装后变成了垃圾字符。)
答案 0 :(得分:0)
如果要升级,则所有当前文件都应为Shift-JIS。即使在某些情况下同时保留Shift-JIS和UTF-8文件,您也只需要处理两种类型的编码。因此,可以通过检查文件是否为无效的UTF-8(然后为Shift-JIS)来解决此问题。当然,在极少数情况下,这仍然会导致错误检测,但是对于您的用例来说可能是好的
默认情况下,在读取文本文件时,将使用最适合的后备或替换后备处理程序。我们可以更改为异常备用,因此,如果将Shift-JIS文件打开为UTF-8,它将引发异常。
0
最好遍历文件并在PowerShell中进行转换。如果您确实需要使用批处理文件,则将所有内容包装在* .ps1文件中,然后从批处理中调用