скрипт для сохранения файла в юникоде - PullRequest
5 голосов
/ 06 февраля 2009

Знаете ли вы, каким образом я мог бы программно или с помощью скрипта преобразовать набор текстовых файлов, сохраненных в кодировке ANSI, в кодировку Unicode?

Я хотел бы сделать то же самое, что и я, когда открываю файл с помощью блокнота и выбираю сохранить его как файл Unicode.

Ответы [ 6 ]

10 голосов
/ 07 февраля 2009

Это может сработать для вас, но обратите внимание, что он захватит каждый файл в текущей папке:


Get-ChildItem | Foreach-Object { $c = (Get-Content $_); `
Set-Content -Encoding UTF8 $c -Path ($_.name + "u") }

То же самое, используя псевдонимы для краткости:


gci | %{ $c = (gc $_); sc -Encoding UTF8 $c -Path ($_.name + "u") }

Стивен Муравски предлагает вместо этого использовать Out-File. Различия между обоими командлетами заключаются в следующем:

  • Out-File попытается отформатировать полученные данные.
  • Out-File по умолчанию основана на Unicode, тогда как Set-Content использует системную настройку по умолчанию.

Вот пример, предполагающий, что файл test.txt не существует ни в одном из случаев:


PS> [system.string] | Out-File test.txt
PS> Get-Content test.txt

IsPublic IsSerial Name                                     BaseType          
-------- -------- ----                                     --------          
True     True     String                                   System.Object     

# test.txt encoding is Unicode-based with BOM


PS> [system.string] | Set-Content test.txt
PS> Get-Content test.txt

System.String

# test.txt encoding is "ANSI" (Windows character set)

На самом деле, если вам не нужна какая-либо конкретная кодировка Unicode, вы также можете сделать следующее для преобразования текстового файла в Unicode:


PS> Get-Content sourceASCII.txt > targetUnicode.txt

Out-File - это своего рода «оператор перенаправления с необязательными параметрами».

3 голосов
/ 06 февраля 2009

Самый простой способ - это Get-Content 'path / to / text / file' | out-file 'name / of / file'.

Out-File имеет параметр -encoding , значением по умолчанию является Unicode.

Если вы хотите написать их партию, вы можете сделать что-то вроде

$files = get-childitem 'directory/of/text/files' 
foreach ($file in $files) 
{
  get-content $file | out-file $file.fullname
}
0 голосов
/ 07 февраля 2009

Вы можете создать новый текстовый файл и записать байты из исходного файла в новый, поместив '\ 0' перед каждым исходным байтом (при условии, что исходный текстовый файл был на английском языке).

0 голосов
/ 06 февраля 2009

Вы можете использовать iconv. На Windows вы можете использовать его под Cygwin.

iconv -f from_encoding -t to_encoding file
0 голосов
/ 06 февраля 2009

псевдокод ...

Dim system, file, content, newFile, oldFile

Const ForReading = 1, ForWriting = 2, ForAppending = 3 Const AnsiFile = -2, UnicodeFile = -1

Установить system = CreateObject ("Scripting.FileSystemObject ...

Установить файл = system.GetFile ("text1.txt")

Установить oldFile = file.OpenAsTextStream (ForReading, AnsiFile)

contents = oldFile.ReadAll ()

oldFile.Close

system.CreateTextFile "text1.txt"

Установить файл = system.GetFile ("text1.txt")

Установить newFile = file.OpenAsTextStream (ForWriting, UnicodeFile)

newFile.Пишите содержимое

newFile.Close

Надеюсь, что этот подход будет работать ..

0 голосов
/ 06 февраля 2009

Используйте класс System.IO.StreamReader (для чтения содержимого файла) вместе с базовым классом System.Text.Encoding.Encoding (для создания объекта Encoder, который выполняет кодирование).

...