Наверное многие сталкивались с проблемой смены кодировки в файле посредством Windows. В данной статье я расскажу как можно сменить кодировку посредством VBScript.
Из всех рассмотренных вариантов я решил остановиться на создании объекта ADODB.Stream. Поставим себе задачу преобразовать файл кодировки ANSI в UTF-8. Суть нашего способа будет такова:
- создаем объект ADODB.Stream с параметрами исходной кодировки
- открываем исходный файл
- считываем в переменную весь файл
- меняем параметры ADODB.Stream
- записываем содержимое файла
Для начала создадим объект ADODB.Stream.
Set str= CreateObject(«ADODB.Stream»)
Установим необходимые параметры, откроем и прочитаем файл.
str.Type = 2 str.Charset = "windows-1251" str.Open() str.LoadFromFile("C:ANSI.txt") Text = ADODBStream.ReadText() str.Close()
str.Type = 2 говорит о том, что будет текстовый тип данных. Для справки, если бы мы установили str.Type равным единице, то объект бы считал, что будет daftar situs judi slot online terpercaya бинарный тип данных. В официальной документации написано, что по умолчанию используется текстовый тип, т.е. Type = 2.
str.Charset = «windows-1251» указывает на кодировку. По умолчанию используется кодировка «Unicode».
Text = ADODBStream.ReadText() считывает текстовый файл целиком из объекта. Данные должны быть обязательно текстовыми, для считывания бинарных данных используется другой метод. Также это метод имеет параметры
- ReadText(-1) — считывание файла целиком, является параметром по-умолчанию
- ReadText(-2) — построчное считывание файла
str.Close() закрывает объект ADODB.Stream, но не удаляет его из памяти, следовательно его можно будет заново открыть с другими параметрами.
str.Charset = "UTF-8" str.Open() str.WriteText(Text) str.SaveToFile "C:UTF-8.txt", 2 str.Close()
str.WriteText(Text) записывает текст в объект, для записи бинарных данных используется другой метод. Также вторым параметром может быть указано, добавлять ли разделитель строки.
str.SaveToFile «C:UTF-8.txt», 2 записывает файл по указанному пути. Второй параметр может принимать значения:
- 1 создает файл, если он еще не существует, является значение по умолчанию.
- 2 перезаписывает данные в имеющемся файле
Вот и все, весь получившийся код ниже.
Set str= CreateObject("ADODB.Stream") str.Type = 2 str.Charset = "windows-1251" str.Open() str.LoadFromFile("C:ANSI.txt") Text = ADODBStream.ReadText() str.Close() str.Charset = "UTF-8" str.Open() str.WriteText(Text) str.SaveToFile "C:UTF-8.txt", 2 str.Close()
comments powered by HyperComments
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
‘ перекодировка кириллицы в юникод | |
public function Win1251_ToUTF8(ByVal S) | |
dim Res, i, AscCode, Symb, b1, b2, utfc | |
Res = «» | |
for I = 1 to Len(S) | |
Symb = Mid(S, I, 1) | |
AscCode = Asc(Symb) | |
‘ кириллица кроме ё и Ё | |
if (AscCode >= 192) and (AscCode <= 255) then | |
Res = Res & «�» & Hex(AscCode + &H410 — 192) & «;» | |
‘ ё | |
elseif AscCode = 184 then | |
Res = Res & «ё» | |
‘ Ё | |
elseif AscCode = 168 then | |
Res = Res & «Ё» | |
‘ № | |
elseif AscCode = 185 then | |
Res = Res & «№» | |
‘ ‘ | |
elseif AscCode = 39 then | |
Res = Res & «'» | |
‘ « | |
elseif AscCode = 34 then | |
Res = Res & «"» | |
‘ < | |
elseif AscCode = 60 then | |
Res = Res & «<» | |
‘ > | |
elseif AscCode = 62 then | |
Res = Res & «>» | |
‘ & | |
elseif AscCode = 38 then | |
Res = Res & «&» | |
‘ « | |
elseif AscCode = 171 then | |
Res = Res & ««»‘»«» | |
‘ » | |
elseif AscCode = 187 then | |
Res = Res & «»»‘»»» | |
else | |
Res = Res & Symb | |
end if | |
next | |
Win1251_ToUTF8 = Res | |
end function |
Гена9 0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 28 |
||||
1 |
||||
VBS 16.09.2021, 19:10. Показов 5966. Ответов 22 Метки нет (Все метки)
Здравствуйте! Кликните здесь для просмотра всего текста
__________________
0 |
FlasherX 5292 / 2481 / 987 Регистрация: 06.06.2017 Сообщений: 8,483 |
||||
16.09.2021, 19:26 |
2 |
|||
но оно вообще портит запись в файле С чего бы?
1 |
0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 28 |
|
16.09.2021, 19:59 [ТС] |
3 |
С чего бы? Не помогает и опять же выходной файл в кодировке utf-16 LE с BOM
0 |
5292 / 2481 / 987 Регистрация: 06.06.2017 Сообщений: 8,483 |
|
16.09.2021, 20:21 |
4 |
Приложите WinVer.txt.
0 |
Punkt5 малоболт 1122 / 428 / 185 Регистрация: 30.01.2020 Сообщений: 1,070 |
||||
16.09.2021, 20:24 |
5 |
|||
Гена9, Попробуйте открывать/создавать файл в ANSI, а просто запись делать с предварительной перекодировкой текста в UTF-8 с помощью подпрограммы типа:
А файл ObjFile так и открывать в ANSI формате.
0 |
0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 28 |
|
16.09.2021, 20:26 [ТС] |
6 |
Приложено.
0 |
0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 28 |
|
16.09.2021, 20:44 [ТС] |
7 |
Или возвращать строку, переделав эту подпрограмму в функцию, или найдя аналогичную функцию преобразования в нете. К сожалению я в этом не силен, куда и как добавить чтоб заработало
0 |
Punkt5 малоболт 1122 / 428 / 185 Регистрация: 30.01.2020 Сообщений: 1,070 |
||||
16.09.2021, 21:10 |
8 |
|||
Сообщение было отмечено Гена9 как решение Решение
К сожалению я в этом не силен, куда и как добавить чтоб заработало А как вы собираетесь приспосабливать к своим задачам то, что вам посоветуют? Вам же наверное не эта мура нужна, что вы приложили? Конкретно для приложенного случая изменение будет выглядеть так:
Создание объектов FSO и ObjFile я вынес из цикла — зачем им каждый раз создаваться по новой?
1 |
0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 28 |
|
16.09.2021, 22:32 [ТС] |
9 |
А как вы собираетесь приспосабливать к своим задачам то, что вам посоветуют? Вам же наверное не эта мура нужна, что вы приложили? Первый раз сталкиваюсь с таким тяжелым скриптом PS: Файл хоть и преобразовался в utf8, а Кириллица все ровно в ней не читается
0 |
Punkt5 малоболт 1122 / 428 / 185 Регистрация: 30.01.2020 Сообщений: 1,070 |
||||
16.09.2021, 22:38 |
10 |
|||
Сообщение было отмечено Гена9 как решение Решение
PS: Файл хоть и преобразовался в utf8, а Кириллица все ровно в ней не читается А это точно та кириллица, что была записана в него в UTF-8? Или та, что была записана ранее в UTF-16? Попробуйте в строке
Заменить 8 на 2. Тогда файл будет создан с нуля, даже, если он уже существует.
1 |
0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 28 |
|
16.09.2021, 23:14 [ТС] |
11 |
А это точно та кириллица, что была записана в него в UTF-8? Или та, что была записана ранее в UTF-16? Записал Кириллицу заново и заменил восьмерку на двойку (по умолчанию), но развития не последовало Добавлено через 6 минут
0 |
5292 / 2481 / 987 Регистрация: 06.06.2017 Сообщений: 8,483 |
|
16.09.2021, 23:41 |
12 |
А вот с utf8 и oem 866 не читалась Ха. А при чём тут тогда проблемы кода? Если пишете скрипт с кириллицей, то обязаны сохранять .vbs в ANSI или UTF-16. Проверяйте мой в годной кодировке. Не нужен вам этот монстр на 20-30+ строк. И UTF-8 тоже не нужен.
0 |
0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 28 |
|
17.09.2021, 11:54 [ТС] |
13 |
Ха. А при чём тут тогда проблемы кода? Если пишете скрипт с кириллицей, то обязаны сохранять .vbs в ANSI или UTF-16. Проверяйте мой в годной кодировке. Не нужен вам этот монстр на 20-30+ строк. И UTF-8 тоже не нужен. Ничего не подходит
0 |
5292 / 2481 / 987 Регистрация: 06.06.2017 Сообщений: 8,483 |
|
17.09.2021, 12:35 |
14 |
Гена9, что значит «частично»? Приложенный файл говорит о неверном сохранении скрипта. Других проблем тут нет.
0 |
0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 28 |
|
17.09.2021, 15:13 [ТС] |
15 |
что значит «частично»? Приложенный файл говорит о неверном сохранении скрипта. Других проблем тут нет. Частично это значит нет оригинального решения, чтоб сказать вот все встает на свое места, то есть как хотелось бы
0 |
5292 / 2481 / 987 Регистрация: 06.06.2017 Сообщений: 8,483 |
|
17.09.2021, 15:35 |
16 |
Гена9, к чему тут вообще оригинальность? А что и где у вас на свои места в итоге не встало, вы пояснять пока, увы, не хотите.
0 |
0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 28 |
|
17.09.2021, 16:09 [ТС] |
17 |
к чему тут вообще оригинальность? Да просто говорю Добавлено через 3 минуты
А что и где у вас на свои места в итоге не встало, вы пояснять пока, увы, не хотите. Хотел чтоб оставалась в utf8, но увы
0 |
FlasherX 5292 / 2481 / 987 Регистрация: 06.06.2017 Сообщений: 8,483 |
||||
17.09.2021, 17:43 |
18 |
|||
Да просто говорю Прежде стоило понятие универсальности загуглить.
если сам файл преобразовать в utf16 le Какой файл? Скриптовый? Я же привёл кодировки на выбор (LE или BE, не суть). ANSI уместней, т. к. вдвое меньший размер и нет никакого Юникода.
Хотел чтоб оставалась в utf8, но увы Скрипт? Таковы условия WSH, тут ничего не попишешь. Можно извратиться и с UTF-8, только в этом не будет никакого практического смысла:
1 |
0 / 0 / 0 Регистрация: 08.04.2015 Сообщений: 28 |
|
17.09.2021, 20:01 [ТС] |
19 |
Прежде стоило понятие универсальности загуглить. Универсальность или оригинальность, написал просто не в прямом смысле!
Какой файл? Скриптовый? Я же привёл кодировки на выбор (LE или BE, не суть). ANSI уместней, т. к. вдвое меньший размер и нет никакого Юникода. Да, файл скриптовый.
Скрипт? Таковы условия WSH, тут ничего не попишешь. Можно извратиться и с UTF-8, только в этом не будет никакого практического смысла: Все понял уже когда столкнулся с этим скриптом — не простой язык. Добавлено через 2 минуты
А как вы собираетесь приспосабливать к своим задачам то, что вам посоветуют? Уже приспособил и работает как часы!
0 |
5292 / 2481 / 987 Регистрация: 06.06.2017 Сообщений: 8,483 |
|
18.09.2021, 03:58 |
20 |
Сообщение было отмечено Гена9 как решение Решение
Вообще не гуглю, а Яндекслю! Я уже начинал догадываться.
Не заметил где Вы предложили кодировки на выбор. В 12 посте, который продублирован (зачем-то) в цитате 13-го:
обязаны сохранять .vbs в ANSI или UTF-16.
Значит как понимаю в ANSI лучше!? Нет, в таком случае как раз понадобится UTF-16.
Все понял уже когда столкнулся с этим скриптом — не простой язык. При чём тут простота языка? WSH — это сервер сценариев, а не язык. У другого интерпретатора этого же языка могут быть другие условия. И похожий батник в ANSI без
Да конечно и в utf8 тоже портятся символы часто и глупо это отрицать или верить в уникальность этой кодировки! Как и в любой кухне, главное уметь правильно готовить, тогда портиться ничего не будет.
1 |
Asked
9 years, 11 months ago
Viewed
23k times
I have a string assigned to variable that’s encoded as ansi, for example str = "Пирг"
How can I encode it to UTF-8?
asked Mar 5, 2013 at 17:14
1
You mean when writing it to a file? Like this:
Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type = 2 'text
stream.Position = 0
stream.Charset = "utf-8"
stream.WriteText str
stream.SaveToFile filename, 2
stream.Close
Edit: If you want the UTF-8 string to go into another variable you could do it like this:
Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type = 2 'text
stream.Position = 0
stream.Charset = "utf-8"
stream.WriteText str
stream.Flush
stream.Position = 0
stream.Type = 1 'binary
stream.Read(3) 'skip BOM
utfStr = stream.Read
stream.Close
answered Mar 5, 2013 at 17:29
Ansgar WiechersAnsgar Wiechers
189k23 gold badges240 silver badges313 bronze badges
1
|
|
|
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] …текст программы… [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.
Полезные ссылки:
FAQ Сайта FAQ Раздела Кладовка Наши Исходники API-Guide Поиск по Разделу MSDN Library Online Google
Ваше мнение о модераторах: SCINER, B.V.
Как создать файл в кодировке UTF-8 с помощью VBScript?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Здравствуйте, вот так вот создаётся текстовый файлик на языке VBS:
Dim gg, gm Set gg = CreateObject(«Scripting.FileSystemObject») Set gm = gg.CreateTextFile(«text.txt», True) gm.WriteLine(«текст текст текст») gm.WriteLine(«текст текст текст») gm.WriteLine(«текст текст текст») gm.Close Подскажите, что нужно сделать чтобы этот файлик создавался в кодировке UTF-8? |
VSHome |
|
Full Member Рейтинг (т): 36 |
Примерчик
Dim Utf8String Utf8String = StrConvert(«Текст будет преобразован к UTF-8», «Windows-1251», «UTF-8») Function StrConvert(Text, FromCharset, ToCharset) Dim Stream Set Stream = CreateObject(«ADODB.Stream») Stream.Type = 2 Stream.Mode = 3 Stream.Open Stream.Charset = ToCharset Stream.WriteText Text Stream.Position = 0 Stream.Charset = FromCharset StrConvert = Stream.ReadText End Function |
Zeron |
|
Спасибо, а как можно сделать, чтобы этот файл был не BOM? |
MIF |
|
Set gm = gg.CreateTextFile(«text.txt», True, -1) |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Visual Basic: Общие вопросы
- Следующая тема
[ Script execution time: 0,0255 ] [ 16 queries used ] [ Generated: 4.02.23, 22:22 GMT ]
- Remove From My Forums
-
Question
-
I have a question that is probably pretty simple, but I can’t seem to get it figure out.
I have a bunch of text in windows-1251 encoding and I was hoping to convert it to utf-8, so it works across different machines easier (i hope).
I tried something simple like this:
Dim txt As String = «¥»
Dim ar() As Byte
ar = System.Text.Encoding.Default.GetBytes(txt)
txt = System.Text.Encoding.UTF8.GetString(ar)
But I’m not getting the result I need, actually I’m only getting the boxes instead of any letters. Now, I know that «ar» does contain a good set of bytes that represent letters in windows-1251, but how do I take that array of bytes and convert it into a utf-8 string?
Thanks,
Viktor.
Answers
-
That character you specified is not in Windows-1251. See the chart here: http://www.microsoft.com/globaldev/reference/sbcs/1251.mspx
The reason that it «almost» works is because Encoding.Default is using your current code page, which must be something other than Windows-1251. Had you really been converting using Windows-1251, that character would change to a ? mark because it is not in Windows-1251. If you really want Windows-1251, you would need to use System.Text.Encoding.GetEncoding(«Windows-1251») instead of Encoding.Default.
> I have a bunch of text in windows-1251 encoding
Do you have this data in bytes? If you have it in a String, it has already been converted to Unicode — String is always Unicode. If this conversion did not happen correctly, the characters in your String might not be correct.
Once you have it in bytes, it is easy to convert it to a Unicode string:
Replace:
txt = System.Text.Encoding.UTF8.GetString(ar) With:
txt = System.Text.Encoding.Default.GetString(ar) or
txt = System.Text.Encoding.GetEncoding(«Windows-1251»).GetString(ar) Notice that you need to use the Encoding that corresponds to the format the bytes in the parameter (here, ar) use.
If you subsequently need to turn txt into UTF-8 bytes, you can use:
Dim utf8Bytes() As Byte = System.Text.Encoding.UTF8.GetBytes(txt) (There is really no such thing as a UTF-8 String — only UTF-8 Byte array. Make sure you understand this as it goes along way for dealing with text data in .NET.)
-
Marked as answer by
Wednesday, July 2, 2008 4:25 PM
-
Marked as answer by