MIT писал(а):Возможно.
<TD><SELECT....> </SELECT> </TD>
<OPTION value=XXXXXX>000, AAAAA 0000000000</OPTION>
<OPTION value=XXXXXX>000, AAAAA 0000000000</OPTION>
<div id="bot_text">«Доктор Веб» — росс....... доверия к продуктам компании.</div>
Хакер писал(а):Исправить надо свой мозг, полностью прочитав эту статью.
Private Declare Function LocalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal wBytes As Long) As Long
Private Declare Function LocalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
' Constants
Private Const CP_UTF8 As Long = 65001
Private Const LMEM_ZEROINIT As Long = &H40
'--------------------------------------------------------------------------------
' Проект : OfflineClient
' Процедура : WinToUTF8
' Описание : Перевод строки в UTF8 кодировку
' Кем создан : SNE
' Дата-Время : 09.11.2004-11:52:01
'
' Параметры : inString - Строка, в win кодировке
' lMaxSize - Максимальный размер строки
'--------------------------------------------------------------------------------
Function WinToUTF8(ByRef inString As String, _
ByVal lMaxSize As Long) As String
Dim hMemLock1 As Long, hMemLock2 As Long
Dim iStrSize As Long
hMemLock1 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
hMemLock2 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
iStrSize = MultiByteToWideChar(0&, 0&, inString, &HFFFF, hMemLock1, lMaxSize)
iStrSize = WideCharToMultiByte(65001, 0&, hMemLock1, iStrSize, hMemLock2, lMaxSize, 0&, 0&) ' CP_UTF8
If Len(iStrSize) Then
WinToUTF8 = String$(iStrSize, 0&)
Call CopyMemory(ByVal WinToUTF8, ByVal hMemLock2, iStrSize)
End If
Call LocalFree(hMemLock1)
Call LocalFree(hMemLock2)
End Function
'--------------------------------------------------------------------------------
' Проект : OfflineClient
' Процедура : UTF8ToWin
' Описание : Перевод UTF8 строки в WIN кодировку
' Кем создан : SNE
' Дата-Время : 09.11.2004-11:56:58
'
' Параметры : inString - Строка в utf8 кодировке
' lMaxSize - Максимальный размер строки
'--------------------------------------------------------------------------------
Function UTF8ToWin(ByRef inString As String, _
ByVal lMaxSize As Long) As String
Dim hMemLock1 As Long, hMemLock2 As Long
Dim iStrSize As Long
hMemLock1 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
hMemLock2 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
iStrSize = MultiByteToWideChar(CP_UTF8, 0&, inString, &HFFFF, hMemLock1, lMaxSize)
iStrSize = WideCharToMultiByte(0&, 0&, hMemLock1, &HFFFF, hMemLock2, iStrSize, 0&, 0&)
If Len(iStrSize) Then
UTF8ToWin = String$(iStrSize, 0&)
Call CopyMemory(ByVal UTF8ToWin, ByVal hMemLock2, iStrSize)
End If
Call LocalFree(hMemLock1)
Call LocalFree(hMemLock2)
End Function
Хакер писал(а):Сможешь объяснить, почему используются именно Local-функции?
Public Function UTF8ToUnicod(ByVal inString As String) As String
Dim iStrSize As Long
Dim s As String
' inString = inString & vbNullChar '& vbNullChar
iStrSize = Len(inString)
s = String$(iStrSize, 0&)
iStrSize = MultiByteToWideChar(idUTF8, 0&, inString, &HFFFF, StrPtr(s), iStrSize)
UTF8ToUnicod = Left$(s, iStrSize - 1)
End Function
Ну, со стилем у меня всегда было не ахти А бейсик и сам хранит неуникодные строки как уникодные и постоянно конвертирует взад-вперед, так что вносить дополнительную путаницу я бы не стал.Хакер писал(а):как UTF-8 разнесённый по BSTR, или как UTF-8 наложенный на BSTR. Использовать String-переменные для хранения не UCS-2-строк — дурной тон. Это вопрос стиля.
Ну, тогда вообще везде можно отказаться от бейсиковских средств работы со строками В принципе, так, наверное, и лучше и быстрее, но со строками всё же и понятней, и привычней.Хакер писал(а):если из этого выделить только необходимые действия, то останется HeapAlloc, SysAllocStringLen и SysFreeString. Быстрее и стилистически правильнее.
Что такое сфейлит?Хакер писал(а):Если MB2WC сфейлит
Public Function UTF8(inString As String) As String
Dim iStrSize As Long
Dim s As String
iStrSize = Len(inString)
s = String$(iStrSize, 0&)
If iStrSize Then iStrSize = MultiByteToWideChar(idUTF8, 0&, inString, &HFFFF, StrPtr(s), iStrSize)
If iStrSize >= 0 Then
UTF8 = Left$(s, iStrSize - 1)
else
'тут, наверное, тоже что-то надо сделать?
end if
End Function
iStrSize = MultiByteToWideChar(idUTF8, 0&, inString, &HFFFF, StrPtr(s), iStrSize)
Public Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long
Public Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Const CP_UTF8 = 65001
'Purpose:Convert Utf8 to Unicode
Public Function UTF8_Decode(ByVal sUTF8 As String) As String
Dim lngUtf8Size As Long
Dim strBuffer As String
Dim lngBufferSize As Long
Dim lngResult As Long
Dim bytUtf8() As Byte
Dim n As Long
If LenB(sUTF8) = 0 Then Exit Function
If m_bIsNt Then
On Error GoTo EndFunction
bytUtf8 = StrConv(sUTF8, vbFromUnicode)
lngUtf8Size = UBound(bytUtf8) + 1
On Error GoTo 0
'Set buffer for longest possible string i.e. each byte is
'ANSI, thus 1 unicode(2 bytes)for every utf-8 character.
lngBufferSize = lngUtf8Size * 2
strBuffer = String$(lngBufferSize, vbNullChar)
'Translate using code page 65001(UTF-8)
lngResult = MultiByteToWideChar(CP_UTF8, 0, bytUtf8(0), _
lngUtf8Size, StrPtr(strBuffer), lngBufferSize)
'Trim result to actual length
If lngResult Then
UTF8_Decode = Left$(strBuffer, lngResult)
End If
Else
Dim i As Long
Dim TopIndex As Long
Dim TwoBytes(1) As Byte
Dim ThreeBytes(2) As Byte
Dim AByte As Byte
Dim TStr As String
Dim BArray() As Byte
'Resume on error in case someone inputs text with accents
'that should have been encoded as UTF-8
On Error Resume Next
TopIndex = Len(sUTF8) ' Number of bytes equal TopIndex+1
If TopIndex = 0 Then Exit Function ' get out if there's nothing to convert
BArray = StrConv(sUTF8, vbFromUnicode)
i = 0 ' Initialise pointer
TopIndex = TopIndex - 1
' Iterate through the Byte Array
Do While i <= TopIndex
AByte = BArray(i)
If AByte < &H80 Then
' Normal ANSI character - use it as is
TStr = TStr & Chr$(AByte): i = i + 1 ' Increment byte array index
ElseIf AByte >= &HE0 Then 'was = &HE1 Then
' Start of 3 byte UTF-8 group for a character
' Copy 3 byte to ThreeBytes
ThreeBytes(0) = BArray(i): i = i + 1
ThreeBytes(1) = BArray(i): i = i + 1
ThreeBytes(2) = BArray(i): i = i + 1
' Convert Byte array to UTF-16 then Unicode
TStr = TStr & ChrW$((ThreeBytes(0) And &HF) * &H1000 + (ThreeBytes(1) And &H3F) * &H40 + (ThreeBytes(2) And &H3F))
ElseIf (AByte >= &HC2) And (AByte <= &HDB) Then
' Start of 2 byte UTF-8 group for a character
TwoBytes(0) = BArray(i): i = i + 1
TwoBytes(1) = BArray(i): i = i + 1
' Convert Byte array to UTF-16 then Unicode
TStr = TStr & ChrW$((TwoBytes(0) And &H1F) * &H40 + (TwoBytes(1) And &H3F))
Else
' Normal ANSI character - use it as is
TStr = TStr & Chr$(AByte): i = i + 1 ' Increment byte array index
End If
Loop
UTF8_Decode = TStr ' Return the resultant string
Erase BArray
End If
EndFunction:
End Function
'Purpose:Convert Unicode string to UTF-8.
Public Function UTF8_Encode(ByVal strUnicode As String, Optional ByVal bHTML As Boolean = True) As String
Dim i As Long
Dim TLen As Long
Dim lPtr As Long
Dim UTF16 As Long
Dim UTF8_EncodeLong As String
TLen = Len(strUnicode)
If TLen = 0 Then Exit Function
If m_bIsNt Then
Dim lngBufferSize As Long
Dim lngResult As Long
Dim bytUtf8() As Byte
'Set buffer for longest possible string.
lngBufferSize = TLen * 3 + 1
ReDim bytUtf8(lngBufferSize - 1)
'Translate using code page 65001(UTF-8).
lngResult = WideCharToMultiByte(CP_UTF8, 0, StrPtr(strUnicode), _
TLen, bytUtf8(0), lngBufferSize, vbNullString, 0)
'Trim result to actual length.
If lngResult Then
lngResult = lngResult - 1
ReDim Preserve bytUtf8(lngResult)
'CopyMemory StrPtr(UTF8_Encode), bytUtf8(0&), lngResult
UTF8_Encode = StrConv(bytUtf8, vbUnicode)
' For i = 0 To lngResult
' UTF8_Encode = UTF8_Encode & Chr$(bytUtf8(i))
' Next
End If
Else
For i = 1 To TLen
' Get UTF-16 value of Unicode character
lPtr = StrPtr(strUnicode) + ((i - 1) * 2)
CopyMemory UTF16, ByVal lPtr, 2
'Convert to UTF-8
If UTF16 < &H80 Then ' 1 UTF-8 byte
UTF8_EncodeLong = Chr$(UTF16)
ElseIf UTF16 < &H800 Then ' 2 UTF-8 bytes
UTF8_EncodeLong = Chr$(&H80 + (UTF16 And &H3F)) ' Least Significant 6 bits
UTF16 = UTF16 \ &H40 ' Shift right 6 bits
UTF8_EncodeLong = Chr$(&HC0 + (UTF16 And &H1F)) & UTF8_EncodeLong ' Use 5 remaining bits
Else ' 3 UTF-8 bytes
UTF8_EncodeLong = Chr$(&H80 + (UTF16 And &H3F)) ' Least Significant 6 bits
UTF16 = UTF16 \ &H40 ' Shift right 6 bits
UTF8_EncodeLong = Chr$(&H80 + (UTF16 And &H3F)) & UTF8_EncodeLong ' Use next 6 bits
UTF16 = UTF16 \ &H40 ' Shift right 6 bits
UTF8_EncodeLong = Chr$(&HE0 + (UTF16 And &HF)) & UTF8_EncodeLong ' Use 4 remaining bits
End If
UTF8_Encode = UTF8_Encode & UTF8_EncodeLong
Next
End If
'Substitute vbCrLf with HTML line breaks if requested.
If bHTML Then
UTF8_Encode = Replace$(UTF8_Encode, vbCrLf, "")
End If
End Function
такой кодировки не бывает Есть конкретные кодировки, например, Windows 1251.Diamock писал(а):в win-кодировку
Diamock писал(а):Вот ещё один код, рабочий. Хочется знать, насколько он кривой?
For Each HTMLTable1 In HTMLDocument1.All.tags("TABLE")
If HTMLTable1.className = "result_table" Then
Set HTMLTableRow1 = HTMLTable1.rows(1)
If Not HTMLTableRow1 Is Nothing Then
If HTMLTableRow1.className = "result_table_datarow_border" Then
arthur2 писал(а):Забавно, но ByVal я добавил на всякий случай, чтобы не попортить входную строку. Изначально я добавлял к ней два нуля - но, вроде, работает и без этого
arthur2 писал(а):Ну, со стилем у меня всегда было не ахти А бейсик и сам хранит неуникодные строки как уникодные и постоянно конвертирует взад-вперед, так что вносить дополнительную путаницу я бы не стал.
Ну, тогда вообще везде можно отказаться от бейсиковских средств работы со строками В принципе, так, наверное, и лучше и быстрее, но со строками всё же и понятней, и привычней.
Что такое сфейлит?
Это очень субъективно. Тебе может и понятно, а начинающим - точно понятней с привычными бейсиковскими строками.Хакер писал(а):То, что я сказал, не на столько непонятнее, чтобы отказываться.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Заголовок</title>
</head>
<body>
...
<table>
<tr><td>Параментр 1</td><td>Значение 1</td></tr>
<tr><td>Параментр 2</td><td>Значение 2</td></tr>
<tr><td>Параментр 3</td><td>Значение 3</td></tr>
....
<tr><td>Параментр N</td><td>Значение N</td></tr>
....
</table>
....
</body>
Kytx писал(а):Насколько понимаю HTML можно парсить как и XML. С последним проделываю это регулярно, а с ХТМЛ не получается.
Sub Primer()
Dim HTMLDoc As MSHTML.HTMLDocument
Set HTMLDoc = New HTMLDocument
HTMLDoc.Open "d:\509026.html"
End Sub
Set dom = CreateObject("HTMLFile")
dom.write <data>
Во время выполнения произошла ошибка.
Запустить отладку?
Строка 1.
Ошибка: Синтаксическая ошибка.
Sub Primer()
Dim nFreeFile As Integer, FilePath As String, FileText As String
FilePath = "d:\509026.html"
' Считываем тело файла
nFreeFile = FreeFile
Open FilePath For Input As nFreeFile
FileText = input(FileLen(FilePath), #nFreeFile)
Close nFreeFile
' Создаем объект Doc.
Dim Doc 'As MSHTML.HTMLDocument
Set Doc = CreateObject("HTMLFile")
'Открываем документ и пишем в него тело файла
Doc.Open
Doc.Write FileText
Doc.Close
x = Doc.body.innerHTML
End Sub
Dim fn As Integer, dom As Object
fn = FreeFile
Open "..." For Input As #fn
Set dom = CreateObject("HTMLFile")
dom.write Input(LOF(fn), #fn)
Close #fn
MsgBox dom.document.innerHTML
Сейчас этот форум просматривают: Google-бот, SemrushBot, Yandex-бот и гости: 11