RFJ
Репутация: +1
Зарегистрирован: 02.08.2011 Сообщения: 59
|
Добавлено: Пт Ноя 11, 2011 9:37 pm Заголовок сообщения: Декодирование UTF-8 записью/чтением файла |
|
|
Декодирование файла в кодировке UTF-8 возможно записью в файл, а затем чтением из этого файла с использованием сервисов com.sun.star.ucb.SimpleFileAccess, com.sun.star.io.TextOutputStream, com.sun.star.io.TextInputStream.
Например, есть файл odt с текстом в кодировке UTF-8.
Макрос для декодирования, декодирует текущий документ и записывает результат в новый документ "decode_utf8",
файл "C:\iconv\uuu" - вспомогательный, используется для кодирования/декодирования с помощью записи/чтения.
Код: | Sub decode_utf8( )
oStr = ThisComponent.getText().String
sFileName="C:\iconv\uuu"
sEncodeRead="UTF-8"
sEncodeWrite="Windows-1251"
writefile(oStr, sFileName, sEncodeWrite)
'''''''' Ожидание записи файла '''''''''''''''''''''''''''''''''''''''''''
'wait 1000
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
oStr = readfile(sFileName, sEncodeRead)
oStr=Replace(oStr, funichar(65533) & "?", "И") '<- ИСПРАВИТЬ ОШИБКУ ДЕКОДЕРА UTF-8
Dim Args(0) As New com.sun.star.beans.PropertyValue
oDoc1 = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Args())
oDoc1.Title="decode_utf8"
oTextCursor = oDoc1.Text.CreateTextCursor()
oDoc1.Text.insertString(oTextCursor,oStr,False)
End Sub
|
Запись и чтение файла с кодированием/декодированием:
Код: | Sub writefile(engstr, sPath, sEncoding)
sfa = createUnoService("com.sun.star.ucb.SimpleFileAccess")
tos = createUnoService("com.sun.star.io.TextOutputStream")
oFile = sfa.openFileWrite(sPath)
oFile.truncate()
tos.OutputStream = oFile
tos.Encoding = sEncoding
tos.WriteString(engstr)
oFile.closeOutput
tos.closeOutput
End Sub
Function readfile(sPath, sEncoding)
Dim sData(0)
sfa = createUnoService("com.sun.star.ucb.SimpleFileAccess")
tis = createUnoService("com.sun.star.io.TextInputStream")
oFile = sfa.openFileRead(sPath)
tis.Encoding=sEncoding
tis.setInputStream(oFile)
sLine=""
k=1
Do While tis.isEOF=false
sData(n) = tis.ReadLine
If fcode(sData(n))=0 And k=1 Then
sLine = sLine & sData(n) & Chr(13) '& Chr(10)
k=2
Else
sLine = sLine & sData(n) & Chr(13) '& Chr(10)
k=1
End If
If fcode(sData(n))=0 And k=2 Then
sLine=sLine
End If
Loop
oFile.closeInput
tis.CloseInput()
readfile=sLine
End Function
|
Дополнительные функции для символов и кодов (в т.ч. Unicode):
Код: | '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function fcode(u) As Integer
FuncAcc = createunoservice("com.sun.star.sheet.FunctionAccess")
fcode= FuncAcc.callFunction("CODE",array(u))
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function fchar(u) 'As String
FuncAcc = createunoservice("com.sun.star.sheet.FunctionAccess")
fchar= FuncAcc.callFunction("CHAR",array(u))
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function funicode(u) As Double
FuncAcc = createunoservice("com.sun.star.sheet.FunctionAccess")
funicode= FuncAcc.callFunction("UNICODE",array(u))
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function funichar(u) 'As String
FuncAcc = createunoservice("com.sun.star.sheet.FunctionAccess")
funichar= FuncAcc.callFunction("UNICHAR",array(u))
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' |
Результат декодирования:
Файл с примером: http://ifolder.ru/26898819
|
|