Seite 1 von 2

unterschiedlicher Zeichensatz

Verfasst: Mi 24. Jun 2020, 17:22
von nordi0
Ich lese mit LINE INPUT eine Datei ein, welche von einem externen Programm weggeschrieben wurde. Nachdem in manchen Zeilen HTML-Code vorhanden ist, eliminiere ich diesen, bzw. ersetze die Umlaute durch z. B.

sText = Replace(sText,"ä","ä")

Die Zeilen werden mit PRINT in eine andere Datei weggeschrieben.

Vorhandene, nicht geänderte Umlaute (da nicht HTML-Code) werden im Editor richtig dargestellt. Die geänderten jedoch mit � . Beim Einlesen dieser weggeschriebenen Datei in einem weiteren Programm wird von einem Zeichensatz UTF-8 und eingestellter Codepage 1252 ausgegangen. Die durch das vba-Macro nicht geänderten Umlaute kommen richtig, die geänderten jedoch als Leerzeichen.

Woran liegt das?

Re: unterschiedlicher Zeichensatz

Verfasst: Mi 24. Jun 2020, 18:21
von craig
Hallo,

ich weiß nicht was bei Dir schief läuft.
Vorhandene, nicht geänderte Umlaute (da nicht HTML-Code) werden im Editor richtig dargestellt.
Was meist Du mit Editor?
  • Die Basic-IDE
  • Writer oder Calc oder :?:
  • Notepad++ oder ein anderer Editor?
  • oder :?:
Die geänderten jedoch mit �
geändert mit diesem Code?

Code: Alles auswählen

sText = Replace(sText,"ä","ä")
Dann teste mal meinen Code (siehe weiter unten).

Info:
  • Zeichen = ä
  • hexadezimal = 00E4
  • dezimal = 228
  • Zeichen = �
  • hexadezimal = FFFD
  • dezimal = 65533

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main

sText="ä"
sText = Replace(sText,"ä","ä")
msgbox sText & Chr(10) _
			& "dezimal → " & asc(sText) & chr(10) _
			& "hexadezimal → " & hex(asc(sText)) & Chr(10) _
			& Chr(10) _
			& Chr(65533) & Chr(10) _ 
			& "dezimal → " & asc(Chr(65533)) & chr(10) _
			& "hexadezimal → " & hex(Chr(65533)), 64, "Unicode" & "  ↔  " & "Zeichen"

End Sub
Hier eine Datei mit einer Unicode-Liste: 0-65536
Unicode Liste.ods
(901.17 KiB) 217-mal heruntergeladen
http://unicode.org/main.html

Re: unterschiedlicher Zeichensatz

Verfasst: Mi 24. Jun 2020, 20:09
von nordi0
Dein Testprogramm liefert:

ä
dezimal → 228
hexadezimal → E4


dezimal → 65533
hexadezimal → 0

Habe das ursprünglich mit Visual Studio (Editor) angesehen.

Habe das nochmal mit Notepad ausprobiert. Alle Umlaute, welche ich auch einlese, werden in UTF-8 richtig weggeschrieben. Alle Änderungen, welche ich im Makro vornehme, werden als ANSI erzeugt. Folglich in UTF-8 falsch interpretiert.

Wie kann ich die Änderungen in UTF-8 vornehmen? Wie gebe ich den Hex- oder dezimal-Code für das jeweilige Zeichen bei z. B. REPLACE an?

Re: unterschiedlicher Zeichensatz

Verfasst: Mi 24. Jun 2020, 21:36
von craig
Hallo,

LibreOffice/ OpenOffice arbeiten mit UTF-8.
Ich weiß an dieser Stelle allerdings nicht, wie die Office interne Zeichenverarbeitung funktioniert.
ASCII oder UTF-8?
Weil in Makros die Runtime-Funktionen zum Einsatz kommen, welche eindeutig ASCII-basiert sind. :roll:
Ggf. ist dies ein Relikt aus alten StarOffice-Tagen.

https://de.wikipedia.org/wiki/American_ ... nterchange
https://de.wikipedia.org/wiki/ANSI-Zeichencode

https://www.torsten-horn.de/techdocs/ascii.htm

MS-Programme haben früher nur mit dem ASCII- und später mit dem erweiterten ANSI-Zeichensatz gearbeitet.
Wie das heute ist weiß ich nicht so genau.

Wenn Du mit Notepad den Windows-Editor meinst, dann empfehle ich Dir mal Notepad++ zu testen.
Hiermit können die Zeichenkodierungen direkt über die Menüleiste konvertiert werden.
  • Menü Kodierung
https://notepad-plus-plus.org/downloads/
Wie gebe ich den Hex- oder dezimal-Code für das jeweilige Zeichen bei z. B. REPLACE an?
Alle Änderungen, welche ich im Makro vornehme, werden als ANSI erzeugt. Folglich in UTF-8 falsch interpretiert.
Mein Makro liefert das korrekte Ergebnis (bis auf einen kleinen Flüchtigkeitsfehler: siehe weiter unten :oops: ).
Im wesentlichen habe ich nur die beiden ASCII-Runtime-Funktionen ASC() und CHR() verwendet.
http://www.dannenhoefer.de/faqstarbasic ... ibtes.html
Wie gebe ich den Hex- oder dezimal-Code für das jeweilige Zeichen bei z. B. REPLACE an?
  • ASCII → 65 → großes A
  • UTF-8 → 65 → großes A

Code: Alles auswählen

Sub Main

' liefert das Zeichen
msgbox chr(65) & chr(10) _
				& chr(228),64,"liefert das Zeichen"
' liefert den Dezimal-Code
msgbox asc("A") & chr(10) _
				& asc("ä"),64,"liefert den Dezimal-Code"
' Verkettung von Zeichen
msgbox "Zeichenkette →  " & chr(65) &chr(66) &chr(67) & chr(10) _
				& "Dezimal-Code →  "  & asc("A") &  " → " & asc("B")  &  " → " &asc("C") ,64,"Verkettung von Zeichen"
End Sub
----------------------------------------------------

dezimal → 65533
hexadezimal → 0
Da ist mir doch glatt ein Fehler passiert... :oops:
Korrekt ist:
hexadezimal → FFFD[/quote]

Korrigierter Code:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main

sText="ä"
sText = Replace(sText,"ä","ä")
msgbox sText & Chr(10) _
			& "dezimal → " & asc(sText) & chr(10) _
			& "hexadezimal → " & hex(asc(sText)) & Chr(10) _
			& Chr(10) _
			& Chr(65533) & Chr(10) _ 
			& "dezimal → " & asc(Chr(65533)) & chr(10) _
			& "hexadezimal → " & hex(ASC("�")), 64, "Unicode" & "  ↔  " & "Zeichen"
End Sub
---------------------------------------------------------------------------------
Alle Änderungen, welche ich im Makro vornehme, werden als ANSI erzeugt. Folglich in UTF-8 falsch interpretiert.
Mir ist weder Dein Code, noch Dein konkretes Vorgehen bekannt.

Mit Visual Studio (Editor) und mit VB/ VBA wird hier nicht programmiert, sondern
mit der Basic-IDE und der Sprache StarBasic.
Wobei die Sprache Starbasic abhängig von der ausgeführten Applikation (Writer/ Calc/, usw.) ist.

Mehr weiß ich nicht zu diesem Thema.

Re: unterschiedlicher Zeichensatz

Verfasst: Do 25. Jun 2020, 06:26
von Wanderer
nordi0 hat geschrieben:
Mi 24. Jun 2020, 17:22
in einem weiteren Programm wird von einem Zeichensatz UTF-8 und eingestellter Codepage 1252 ausgegangen.
Es geht nur eins von beidem. Entweder man benutzt Unicode 8/16/32
oder ein System in dem eine Zusätzliche Codepage festlegt, wie Zahlen und Symbole zugeordnet werden.

Mfg, Jörn

Re: unterschiedlicher Zeichensatz

Verfasst: Do 25. Jun 2020, 06:34
von Wanderer
nordi0 hat geschrieben:
Mi 24. Jun 2020, 17:22
sText = Replace(sText,"ä","ä")
...
Woran liegt das?
Hallo,

Du hast das Zeichen einfach geschrieben und die Kodierung der Basic-IDE / dem Macro-Interpreter überlassen. Ich schätze hier wird das falsche 8bit-Zeichen erzeugt.
Wenn Du den Code selbst via CHR() erzeugst, sollte es passen.

Siehe
https://forum.openoffice.org/en/forum/v ... hp?t=83800

Mfg, Jörn

Re: unterschiedlicher Zeichensatz

Verfasst: Do 25. Jun 2020, 07:47
von Wanderer
craig hat geschrieben:
Mi 24. Jun 2020, 21:36
Hallo,

LibreOffice/ OpenOffice arbeiten mit UTF-8.
Ich weiß an dieser Stelle allerdings nicht, wie die Office interne Zeichenverarbeitung funktioniert.
ASCII oder UTF-8?
Weil in Makros die Runtime-Funktionen zum Einsatz kommen, welche eindeutig ASCII-basiert sind. :roll:
Ggf. ist dies ein Relikt aus alten StarOffice-Tagen.
Hallo,

ich glaube mich zu erinnern, dass intern Unicode-16 verwendet wird.

Wenn man sich den oben von mir angegebenen Link ansieht, scheint die CHR-Funktion durchaus mit Unicode umgehen zu können: CHR(11389)

Man muss sich aber gelegentlich daran erinnern, dass das Umfeld nicht einfacher geworden ist.

In Calc ist das Verhalten von Code() und Zeichen() auch nur für 7/8-Bit definiert, danach gibt es z.B. UNIZEICHEN()

https://help.libreoffice.org/4.4/Calc/T ... ns/de#CODE

mfg, Jörn

Re: unterschiedlicher Zeichensatz

Verfasst: Do 25. Jun 2020, 17:37
von nordi0
Danke zunächst für eure Antworten.

-> Jörn
Hab das mal mit CHR() ausprobiert, geht nur intern, aber ist im Outputfile falsch. Dazu ein kleines Testmakro. (Arbeite in Calc.)

Code: Alles auswählen

Sub Test1
    Dim sText as String
    Open "d:\WEB\GEDCOM\Test.ged" For Input AS 1
    Open "d:\WEB\GEDCOM\Test2.ged" For Output AS 2
    DO WHILE NOT EOF(1)
	Line Input #1, sText
	sText = Replace(sText,"ä",CHR(228))
	sText = Replace(sText,"Ö",CHR(214))
        Print #2,sText
        Print sText	
    Loop
End Sub	
Das Input-File:

Code: Alles auswählen

1 äöüÖÄÜß
1 NOTE ä
1 NOTE Ö
Das Print am Bildschirm bringt jeweils:

1 äöüÖÄÜß

Code: Alles auswählen

1 NOTE ä
1 NOTE Ö
Das Output-File:

Code: Alles auswählen

1 äöüÖÄÜß
1 NOTE �
1 NOTE �
PRINT (auch MsgBox) macht was anderes als PRINT #2 ? Erfolgt zwischen internen Variablen und Print noch eine Konvertierung?

Re: unterschiedlicher Zeichensatz

Verfasst: Do 25. Jun 2020, 18:51
von craig
Hallo,

ich glaube wir drehen uns hier im Kreis.

Die Extrension .ged ist keine Libreoffice Dateinamenserweiterung
und nach meiner Recherche geht es um diese Anwendung:
http://www.geditcom.com/tutorials/index.html

Es ist möglich, dass die erzeugten Zeichen nicht HTML-codiert sind, sondern
JAVA-codiert und dies könnte auch ein Grund für Deine Konvertierungsprobleme sein.
JAVA Umlaute

Hier eine Beispieldatei mit einem "Suchen & Ersetzen" Makro.
Das Makro ist nur in Writer lauffähig! Lese auch die Seite 2, dort kannst Aus Deiner .ged-Datei einen Beispieltext einfügen und das Ergebnis prüfen.

Lese auch Seite 1, dort beschreibe ich wie die die Suchen-/ Ersetzen-Array's funktionieren.
Sucharray = Array("Ä","ä","Ö","ö","Ü","ü","ß")

Änderung im Makro, durch einfügen weitere Arrayfelder ist jederzeit möglich, beachte aber meine Beschreibung!
kurzes Beispiel:

Code: Alles auswählen

mFind = Array("Ä","ä","Ö","ö","Ü","ü","ß","Banane")

mReplace = Array("Ä", "ä", "Ö", "ö", "Ü", "ü","ß","Apfel")

Re: unterschiedlicher Zeichensatz

Verfasst: Fr 26. Jun 2020, 00:17
von Wanderer
nordi0 hat geschrieben:
Do 25. Jun 2020, 17:37

PRINT (auch MsgBox) macht was anderes als PRINT #2 ? Erfolgt zwischen internen Variablen und Print noch eine Konvertierung?
Hallo,

ist natürlich ärgerlich. Offensichtlich ist für die Konsole / Msgbox ein anderer Zeichensatz hinterlegt, als für direktes Schreiben in eine Textdatei.
Bei diesen Dingen wird einem klar, warum Python so nervt, damit die Zeichenkodierung hinhaut.

In jedem Fall kenne ich keine Möglichkeit BASIC auf Unicode umzustellen.
Du könntest aber versuchen die Byte-Sequenz selbst zu schreiben (als 2 8-bit Zeichen).

Mfg, Jörn