<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: Глюк ADODB.Stream?]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=7785</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7785&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: Глюк ADODB.Stream?».]]></description>
		<lastBuildDate>Thu, 06 Dec 2012 18:47:18 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66750#p66750</link>
			<description><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p> <br /></p><div class="codebox"><pre><code>
sBuf = StrConv(sBuf,&quot;windows-1251&quot;,&quot;windows-1251&quot;)
</code></pre></div></blockquote></div><p>Хм. Без комментариев похоже на шаманство.&nbsp; Но ведь это действительно работает!<br />Кто бы мог подумать... <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><p>Огромное Спасибо!!!</p>]]></description>
			<author><![CDATA[null@example.com (yuriy2000)]]></author>
			<pubDate>Thu, 06 Dec 2012 18:47:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66750#p66750</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66749#p66749</link>
			<description><![CDATA[<p>Если всё же нужно записать такой текст через FSO в файл в 1251, пусть даже с заменой отсутствующих в ней символов на &quot;?&quot;, то можно предварительно сделать так:<br /></p><div class="codebox"><pre><code>
sBuf = StrConv(sBuf,&quot;windows-1251&quot;,&quot;windows-1251&quot;)
</code></pre></div><p>Получим ту же строку UTF-16, но где неродные для 1251 символы уже заменены на знаки вопроса, так что FSO не будет протестовать.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Thu, 06 Dec 2012 17:58:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66749#p66749</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66748#p66748</link>
			<description><![CDATA[<div class="quotebox"><cite>yuriy2000 пишет:</cite><blockquote><p>Я написал тестовый пример (см. ниже), который создает строки в формате UTF-8</p></blockquote></div><p>Тогда вам нужно использовать функцию ChrB. У вас в примере создаётся строка из двух юникодных двухбайтных символов (UTF-16), а не один двухбайтный символ UTF-8.</p><p>Если читать файл UTF-8 через FSO как ANSI, то во время чтения происходит конвертация в UTF-16, поскольку таков формат строк в VBScript. Конвертация пойдёт по таблице 1251 и в переменной окажется нечитаемый набор символов.</p><p>Восстановить строку можно записью из переменной в Stream, кодировка которого 1251. При этом произойдёт конвертация уже из Юникода по той же 1251 таблице, т.е. процесс, обратный тому, который привёл к порче строки. После этого меняем кодировку Stream на UTF-8, чтобы она соответствовала содержимому и читаем снова в переменную, при этом происходит конвертация в Юникод, но уже по правильной таблице UTF-8. В итоге имеем в переменной читаемый текст в UTF-16.</p><p>При попытке сохранить его через FSO в файл в кодировке 1251 проблема возникает, судя по всему, из-за символов, отсутствующих в целевой кодовой странице, т.е. тех, которые были бы заменены на знак вопроса. Может, забота о том, чтобы у пользователя информация не терялась. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Thu, 06 Dec 2012 16:39:33 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66748#p66748</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66742#p66742</link>
			<description><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><div class="quotebox"><cite>yuriy2000 пишет:</cite><blockquote><p>PS: при использовании аналогичной <a href="http://forum.script-coding.com/viewtopic.php?pid=7364#p7364">функции из копилки</a> с перекодировкой файла таких проблем не возникает <img src="//forum.script-coding.com/img/smilies/cool.png" width="15" height="15" /></p></blockquote></div><p>Но эта функция вам не подходит? Тогда поясните, в чём конкретно ваша задача заключается, что вы пытаетесь сделать?</p></blockquote></div><p>Да, эта функция из копилки (с конвертацией всего файла за один проход) решила мои проблемы, в конкретном случае..., но дело в том, что хотелось бы конвертировать строки в памяти. В будущем...</p><p>Может быть совместными усилиями найдем решение проблемы с этой&nbsp; <strong>StrConv</strong>. <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (yuriy2000)]]></author>
			<pubDate>Thu, 06 Dec 2012 14:09:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66742#p66742</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66717#p66717</link>
			<description><![CDATA[<div class="quotebox"><cite>yuriy2000 пишет:</cite><blockquote><p>PS: при использовании аналогичной <a href="http://forum.script-coding.com/viewtopic.php?pid=7364#p7364">функции из копилки</a> с перекодировкой файла таких проблем не возникает <img src="//forum.script-coding.com/img/smilies/cool.png" width="15" height="15" /></p></blockquote></div><p>Но эта функция вам не подходит? Тогда поясните, в чём конкретно ваша задача заключается, что вы пытаетесь сделать?</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Thu, 06 Dec 2012 10:03:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66717#p66717</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66710#p66710</link>
			<description><![CDATA[<p>Если посмотреть ASCII-код символов на выходе из потока, то можно обратить внимание на характерный факт: &quot;ненулевые&quot; файлы возникают для символов для которых vbscript выдаёт одинаковый код и через Asc и через AscW. Для части символов коды совпадают, для остальных Asc=63(вопросительный знак), и ошибка метода .WriteLine.</p><p>Такое впечатление, что проблемы нет только для символов имеющих &quot;синоним&quot; или дубль в US-ASCII. Навеяно вики(<a href="http://ru.wikipedia.org/wiki/ISO_646#.D0.9D.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D0.B2.D0.B0.D1.80.D0.B8.D0.B0.D0.BD.D1.82.D1.8B_ASCII">ASCII-Национальные варианты ASCII</a>, первый абзац), но обосновать не могу - не по всем работающим символам в статье есть упоминание.</p><p>Полагаю, что пример(по работе напрямую с файлом) работает без проблем по той причине, что ADO.Stream читает и пишет файлы не посимвольно, а побайтово. А потому вся работа с кодировками выполняется в нём без лишних &quot;прокладок&quot;. </p><p>В Вашем случае прибавляется vbscript со своими тараканами.</p><p>Всё ниже сказанное - великое колдунство, которое я сам до конца не понял(какая-то идея под коркой шевелиться, но сформулировать не получается).:)<br />Если заменить:<br /></p><div class="codebox"><pre><code>
oFileOut.WriteLine StrConv(sBuf,&quot;windows-1251&quot;,&quot;UTF-8&quot;)
</code></pre></div><p>на<br /></p><div class="codebox"><pre><code>
oFileOut.WriteLine Chr(AscW(StrConv(sBuf,&quot;windows-1251&quot;,&quot;UTF-8&quot;)))
</code></pre></div><p>то ошибка не возникает, файлы пишутся все.</p><p>P.S. буду премного благодарен, если найдётся голова, которая мне популярно пояснит что же я сделал и почему запись 161-го(например) символа в рассматриваемом скрипте(изначальном) даёт ошибку, а этот код нет:<br /></p><div class="codebox"><pre><code>
option explicit
Dim f : set f = CreateObject(&quot;Scripting.FileSystemObject&quot;).CreateTextFile(&quot;ascii.txt&quot;,True)
f.Write Chr(161)
</code></pre></div><p>P.P.S. возможно таки ADO тут &quot;при чём&quot;...</p>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Thu, 06 Dec 2012 09:04:53 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66710#p66710</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66662#p66662</link>
			<description><![CDATA[<div class="quotebox"><cite>BeS Yara пишет:</cite><blockquote><p>Действительно...</p><p>.....</p><p>Однако, в Вашем случае если ADO и виноват, то лишь косвенно - ошибка возникает всё-таки после того как ADO своё отработал.</p></blockquote></div><p>Возможно, что проблема и&nbsp; не ado.stream , но всё-таки что-то с ним не так, ведь если перекодировать в cp866, то проблем не возникает... <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (yuriy2000)]]></author>
			<pubDate>Wed, 05 Dec 2012 16:25:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66662#p66662</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66623#p66623</link>
			<description><![CDATA[<p>Действительно...</p><p>Правда в свете этого:<br /></p><div class="quotebox"><blockquote><p><a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms681424(v=vs.85).aspx">Charset Property (ADO)</a>:Sets or returns a String value that specifies the character set into which the contents of the Stream will be translated. The default value is Unicode.</p></blockquote></div><p>а также приведённого в MSDN <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms676522(v=vs.85).aspx">примера</a>, всё выглядит не очень логично(для меня), но на тестовом примере(чтение строки из файла в UTF-8, StrConv, запись в ASCII файл) это подтвердилось(похоже я в корне неверно понимаю работу с ado.stream <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />).</p><p>Однако, в Вашем случае если ADO и виноват, то лишь косвенно - ошибка возникает всё-таки после того как ADO своё отработал.</p>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Wed, 05 Dec 2012 07:01:20 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66623#p66623</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66617#p66617</link>
			<description><![CDATA[<p>касательно использования StrConv(sBuf,&quot;UTF-8&quot;,&quot;windows-1251&quot;) - дискуссия была здесь:</p><p><a href="http://forum.script-coding.com/viewtopic.php?id=1179">http://forum.script-coding.com/viewtopic.php?id=1179</a></p>]]></description>
			<author><![CDATA[null@example.com (yuriy2000)]]></author>
			<pubDate>Wed, 05 Dec 2012 01:05:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66617#p66617</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=66548#p66548</link>
			<description><![CDATA[<p>Проблема не в ADO.DB, проблема в FSO - ошибка возникает не при работе со строкой, а при попытке её записать в файл методом WriteLine(достаточно запустить скрипт в отладчике).<br />Соответственно файл уже создан(пустой), записать не удалось. А так как на ошибки забиваем - идём дальше и получаем толпу пустых файлов. Возможно какой-то баг FSO при попытке писать UTF-8 в открытый как ASCII файл.</p><div class="quotebox"><cite>yuriy2000 пишет:</cite><blockquote><p>Я написал тестовый пример (см. ниже), который создает строки в формате UTF-8, содержащие символы C2A0 ... C2BF (символы Unicode&nbsp; U+00A0...U+00BF) и потом их конвертирует в Win-1251</p></blockquote></div><p>Вообще-то, пример делает наоборот <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Чтобы конвертировать из UTF в cp1251 нужно аргументы поменять местами <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br /></p><div class="codebox"><pre><code>oFileOut.WriteLine StrConv(sBuf,&quot;UTF-8&quot;,&quot;windows-1251&quot;)</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Tue, 04 Dec 2012 06:54:06 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=66548#p66548</guid>
		</item>
		<item>
			<title><![CDATA[VBS: Глюк ADODB.Stream?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=65698#p65698</link>
			<description><![CDATA[<p>Случайно столкнулся с неприятным глюком при использовании ADODB.Stream:<br />для конвертации из кодировки UTF-8 в Windows-1251 использую функцию из <a href="http://forum.script-coding.com/viewtopic.php?pid=7448#p7448">копилки идей</a></p><p>При чтении из файла&nbsp; в кодировке UTF-8, содержащего символы определяющие денежные единицы, например символ Йены (код в таблице Unicode U+00A5) или анг.фунта (U+00A3), при условии что не установлена опция <strong>On Error Resume Next </strong>получаем ошибку<br /> </p><div class="quotebox"><blockquote><p>Ошибка выполнения Microsoft VBScript: Недопустимый вызов или аргумент процедуры</p></blockquote></div><p>Точнее ошибка возникает не при чтении, а при дальнейшем использовании строки считанной из файла. </p><p>Я написал тестовый пример (см. ниже), который создает строки в формате UTF-8, содержащие символы C2A0 ... C2BF (символы Unicode&nbsp; U+00A0...U+00BF) и потом их конвертирует в Win-1251 - в результате&nbsp; получается,&nbsp; что создаются не пустыми лишь некоторые файлы.<br /><strong>U+00A0 U+00A4 U+00A6 U+00A7 U+00A9 U+00AB U+00AC U+00AD U+00AE U+00B0 U+00B1 U+00B5 U+00B6 U+00B7 U+00BB.</strong><br />Остальные создаются пустыми. <br />Парадокс: Если конвертировать UTF-8 в кодовую таблицу 866, то таких проблем не возникает. Некоторые символы просто не перекодируются&nbsp; и всё - т.е. файлы в 866-кодировке в тестовом примере получаются размером 2 либо 3 байта. </p><p>Кто-нибудь из гуру может прокомментировать такое странное поведение ADODB.Stream? </p><p>PS: при использовании аналогичной <a href="http://forum.script-coding.com/viewtopic.php?pid=7364#p7364">функции из копилки</a> с перекодировкой файла таких проблем не возникает <img src="//forum.script-coding.com/img/smilies/cool.png" width="15" height="15" /></p><div class="codebox"><pre><code>
Option Explicit

Dim i

On Error Resume Next

for i=&amp;HA0 to &amp;HBF
    test i
next &#039;i
On Error GoTo 0
WScript.Quit


sub test(sAsc)
    Dim sBuf, oFileOut
    Dim oFSO : Set oFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)  

    sBuf=chr(&amp;HC2) &amp; chr(sAsc) &#039;

    set oFileOut = oFSO.CreateTextFile(hex(sAsc) &amp; &quot;.txt&quot;,True)
    &#039;oFileOut.WriteLine StrConv(sBuf,&quot;cp866&quot;,&quot;UTF-8&quot;)
    oFileOut.WriteLine StrConv(sBuf,&quot;windows-1251&quot;,&quot;UTF-8&quot;)
    oFileOut.Close

end sub

Function StrConv(Text,SourceCharset,DestCharset)
    Dim Stream
    Set Stream = CreateObject(&quot;ADODB.Stream&quot;)
    Stream.Type = 2
    Stream.Mode = 3
    Stream.Open
    Stream.Charset = SourceCharset
    Stream.WriteText Text
    Stream.Position = 0
    Stream.Charset = DestCharset
    StrConv = Stream.ReadText
End Function</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (yuriy2000)]]></author>
			<pubDate>Sat, 17 Nov 2012 02:41:12 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=65698#p65698</guid>
		</item>
	</channel>
</rss>
