Datei als UTF-8 mit BOM wegschreiben

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Datei als UTF-8 mit BOM wegschreiben

Re: Datei als UTF-8 mit BOM wegschreiben

von Karolus » Mi, 11.04.2012 17:51

Hallo

Hätte mich auch gewundert wenn es Python nichts gibt um eiine BOM mit in die Datei zu schreiben, man muss nur die richtige Decodierung finden.
In diesem Fall ist es "utf-8-sig" statt "utf8"
siehe im Code meiner letzten Antwort

Code: Alles auswählen

...
...
with codecs.open( filename , "w", "utf-8-sig" ) as outfile:
...
Karo

Re: Datei als UTF-8 mit BOM wegschreiben

von klm » Mi, 11.04.2012 17:43

Recht vielen Dank. Das funktioniert so.
Ich habe Basic verwendet weil ich keine Ahnung von Python habe und auch nicht weiß ob Python dann extra installiert sein muß. Aber so klappt es, noch mal veilen Dank.

Re: Datei als UTF-8 mit BOM wegschreiben

von DPunch » Mi, 11.04.2012 17:35

Servus

Du könntest mal folgendes versuchen, bevor Du Deine tatsächlichen Inhalte in die Datei schreibst, also vor der Schleife:

Code: Alles auswählen

oOutputStream.writeBytes(Array(-17,-69,-65))

Re: Datei als UTF-8 mit BOM wegschreiben

von Karolus » Mi, 11.04.2012 16:53

Hallo

Utf8 benötigt doch eigentlich keine BOM oder sehe ich das falsch.
Wie dem auch sei, als Workaround:
Öffne die Datei nach dem speichern nochmal mit einem vernünftigen Editor ( für Windows z.B. Notepad++ unter Linux gehts mit Geany ) und stelle dort ein mit BOM zu speichern.


Zu deinem Code hätte ich eine etwas komfortablere und aufgeräumtere Variante in Python:
edit: Dekodierung in selection_to_file abgeändert, in der Form wird die BOM geschrieben

Code: Alles auswählen

# -*- coding: utf-8 -*-

import uno
import os
import codecs


context = XSCRIPTCONTEXT
ctx = uno.getComponentContext()
servicemanager = ctx.ServiceManager
createUnoService = servicemanager.createInstance



def selection_to_file():

    """ Store a single Range-selection into a .tsv-like Textfile
        (tsv → Tab Separated Values ) """

    doc = context.getDocument()
    sourcerange = doc.getCurrentSelection()
    source = sourcerange.getDataArray()
    filename = FilePicker()
    if filename:
        lines = [ ]
        for row in source:
            lines.append( '\t'.join( ['%s' %(elem) for elem in row ] ))
        with codecs.open( filename , "w", "utf-8-sig" ) as outfile: # mit BOM 'utf-8-sig' statt 'utf8'
            outfile.write( '\n'.join( lines ))

        

def FilePicker():
    filepicker = createUnoService( "com.sun.star.ui.dialogs.FilePicker" )
    filepicker.setDisplayDirectory("file:///home/karo/aaa/" )
    filepicker.initialize( ( 1,) )
    if filepicker.execute():
        return uno.fileUrlToSystemPath( filepicker.getFiles()[0] )


def getpath():
    folderpicker = createUnoService( "com.sun.star.ui.dialogs.FolderPicker" )
    folderpicker.initialize( ( 1,) )
    if folderpicker.execute():
        return uno.fileUrlToSystemPath( folderpicker.getDirectory())

Im Unterschied zu deinem Code wird hier der explizit selektierte Bereich in eine Tabulatorseparierte Textdatei geschrieben



Karo

Re: Datei als UTF-8 mit BOM wegschreiben

von klm » Mi, 11.04.2012 15:43

http://de.wikipedia.org/wiki/Byte_Order_Mark

ich hoffe das erklärt es besser als ich das könnte.

Re: Datei als UTF-8 mit BOM wegschreiben

von balu » Mi, 11.04.2012 15:00

Hallo klm,

was in Henkersnamen ist denn nun schon wieder BOM!? Da kann ich mir nichts drunter vorstellen. Mach uns (mich) mal etwas schlauer, bitte schön.


Gruß
balu

Datei als UTF-8 mit BOM wegschreiben

von klm » Mi, 11.04.2012 14:40

Ich möchte eine Calc Tabelle mit einem Basic Makro auslesen und in eine Textdatei schreiben. Diese muß in UTF-8 mit BOM formatiert sein.
Daswegschreiben als UTF-8 ist ja kein größeres Problem.
Die BOM überfordert mich aber etwas. Wie kriege ich die an den Anfang der Datei?
Hier mein Makro:
Sub CSV_U_save_Unicode()
GlobalScope.BasicLibraries.LoadLibrary("Tools")
' ----------------------------------------------------------------------
'define variables
dim FileName as string
dim FilePath as string
dim FileTemp as string
dim FileSave as string
dim SavePath as string
dim dummy()
' ----------------------------------------------------------------------
'Pfad auslesen und in Variablen schreiben
FileTemp = thisComponent.geturl()
'Speicherpfad in Dateinamen umwandeln
FileTemp = ConvertFromUrl(FileTemp)
FileName = FileNameoutofPath(FileTemp)
FilePath = DirectoryNameoutofPath(FileTemp,"\")
'der Sicherungspfad wird gleich dem Ursprungpfad gesetzt
FileSave = FileTemp
'Eingabemaske zum manuellen Abändern der Pfadangabe
FileSave = InputBox("Pfad und Dateiname", "ODS + CSV_U - sichern Klaes Version 7.x", FileTemp)
'wenn die vorhande Pfadangabe nicht korrekt ist erfolgt ein Abbruch
If FileSave = "" Then
End
End Sub
'Speicherpfad erzeugen und als ods speichern
SavePath = ConvertToUrl(FileSave)
thisComponent.storeAsUrl(SavePath,dummy())

'CVS_U speichern
' ----------------------------------------------------------------------
'die Letzte verwendete Zeile und Spalte ermitteln
dim LetzteSpalte as integer
dim LetzteZeile as integer
dim sTabelle as object
dim oCursor as object

sTabelle = thisComponent.sheets(0)
oCursor = sTabelle.createCursor
oCursor.GotoEndOfUsedArea(False)
LetzteSpalte = oCursor.getRangeAddress().endColumn
LetzteZeile = oCursor.getRangeAddress().endRow

'Speicherpfad erzeugen und als csv_u speichern
Dim temp as String
temp = GetFileNameWithoutExtension(FileName)
FileSave = FilePath & "\" & temp & ".csv_U"

'Zeilenweise auslesen und in eine Datei speichern
dim i as integer
dim ic as integer
dim Trennzeichen as string
dim Zeile as string
dim Zelle as string
dim oFileWrite as object
dim oOutputStream as object
dim oStream as object
oFileWrite = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
oOutputStream = createUnoService("com.sun.star.io.TextOutputStream")
oOutputStream.Encoding = "UTF-8"

If oFileWrite.exists(FileSave) Then
oFileWrite.kill(FileSave)
End If

'Datei öffnen zum schreiben des Strings
oStream = oFileWrite.openFileWrite(FileSave)
oOutputStream.setOutputStream(oStream)
'Zähler für Zeile + Spalte auf 0 setzen Trennzeichen zwischen den Zellen definieren
i=0
ic=0
Trennzeichen = ";"
Do until i - 1 = LetzteZeile
Do until ic - 1 = LetzteSpalte
Zelle = sTabelle.getCellByPosition(ic,i).string
ic = ic + 1
Zeile = Zeile & Zelle & Trennzeichen
Loop
oOutputStream.writeString(Zeile & CHR$(10))
Zeile = ""
i = i + 1
ic = 0
Loop
'Datei schließen
oOutputStream.closeOutput()

'Dokument schließen
'thisComponent.close(true)

end sub

Kann mir jemand helfen?

Nach oben