有没有一种方法可以通过安装脚本或批处理来检查文件的编码?

时间:2020-09-28 01:16:39

标签: c++ windows batch-file unicode installscript

通过安装脚本/ 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)重新安装后变成了垃圾字符。)

1 个答案:

答案 0 :(得分:0)

如果要升级,则所有当前文件都应为Shift-JIS。即使在某些情况下同时保留Shift-JIS和UTF-8文件,您也只需要处理两种类型的编码。因此,可以通过检查文件是否为无效的UTF-8(然后为Shift-JIS)来解决此问题。当然,在极少数情况下,这仍然会导致错误检测,但是对于您的用例来说可能是好的

默认情况下,在读取文本文件时,将使用最适合的后备或替换后备处理程序。我们可以更改为异常备用,因此,如果将Shift-JIS文件打开为UTF-8,它将引发异常。

0

最好遍历文件并在PowerShell中进行转换。如果您确实需要使用批处理文件,则将所有内容包装在* .ps1文件中,然后从批处理中调用