German ANSI/ASCII in UTF8 umwandeln

J.Schröder

Member
Licensed User
Hallo zusammen,
ich habe das Problem das über TCPIP vom PC ANSI Strings kommen und ich diese korrekt mit Umlauten darstellen möchte.
Alle Versuche und Suchen hat leider kein Ergebnis gebracht

Sub ast_NewText(Text As String)
Dim Buffer() As Byte
Buffer = Text.GetBytes("iso-8859-1")
Text=BytesToString(Buffer, 0, Buffer.Length, "UTF8")
Edit_Receive.Text=Text
End Sub

Bringt noch das beste Ergebnis aber anstelle der Umlaute nur ?

Hat jemand einen besseren Vorschlag?

Danke vorab...
 

Alexander Stolte

Expert
Licensed User
Longtime User
Versuch mal das.

B4X:
Sub Utf2Bytes( s As String ) As Byte()
    Return s.getbytes("UTF-8")
End Sub

Sub Bytes2Utf( b() As Byte ) As String
    Return BytesToString( b, 0, b.Length, "UTF-8" )
End Sub
 

Knoppi

Active Member
Licensed User
Longtime User
Zum Thema selbst nicht.

Aber bitte benutze Code-tags das erleichtert das lesen doch sehr.
UseCodeTags.PNG

B4X:
Sub ast_NewText(Text As String)
  Dim Buffer() As Byte
  Buffer = Text.GetBytes("iso-8859-1")
  Text=BytesToString(Buffer, 0, Buffer.Length, "UTF8")
  Edit_Receive.Text=Text
End Sub
 

J.Schröder

Member
Licensed User
Hi, habe noch keine Lösung gefunden aber das Problem im Moment umgangen indem ich auf PC Seite die Umlaute umformatiere :-(
 

pucki

Active Member
Licensed User
Longtime User
Auf der PC-Seite umformatiere ???

Wieso benutzt du nicht die automatische Text-Umwandlung. ?? Hier ein VB-201x Code-Schnipsel. ;)

B4X:
s_datei$ = "C:\meine_text.txt"
zeile$ = "Das will ich schreiben in der ERSTEN Zeile"

' false = löscht eine bestehende Datei"

My.Computer.FileSystem.WriteAllText(s_datei$, zeile$, False, System.Text.Encoding.Unicode) '<- hier die richtige Codierung aussuchen im Beispiel UNICODE

zeile$ = "Das will ich schreiben in den anderen Zeilen"
'hinweis : Zeilenumbruch nicht vergessen '+ vbCrLf

My.Computer.FileSystem.WriteAllText(s_datei$, zeile$, True)

'Datei wird automatisch geschlossen

Wenn du die Datei senden willst, kannst du sie ja temporär speichern und dann mit einen Fertigen Befehl senden. Ich mache es nämlich genau so. Die übertragung erfolgt in meine Fall via USB / Batchdatei und den ADB-System. Ich schreibe einfach die Batchdatei per Prg. (s.o.) und starte sie dann via Shell.

B4X:
go$ = adb_pfad$ + "\p.bat"
Shell(go$, AppWinStyle.NormalFocus, True)

Es mag noch andere Methoden geben aber ich bin Anfänger auf den Android-Teil ;)

Gruß

Pucki
 

J.Schröder

Member
Licensed User
Danke für die Antwort...
..ich programmiere seit 25 Jahren in Delphi (und bleibe dabei :)
Das Problem habe ich auf der Android Seite mit der Zeichensatzumwandlung und nicht auf der PC Seite !

Gruß, JS
 

J.Schröder

Member
Licensed User
B4X:
[CODE]Sub ast_NewText(Text As String)
    Dim Buffer() As Byte
    Buffer = Text.GetBytes("UTF8")
    Text=BytesToString(Buffer, 0, Buffer.Length, "UTF8")
    Log("Text: " & Text)
End Sub
[/CODE]
 

klaus

Expert
Licensed User
Longtime User
Über Astream newText vom TCPIP Client auf dem PC
Kannst Du uns diesen Code zeigen ?
Liest Du den mit einem Buffer von Bytes ein ?
Wenn ja, dann den Text so umwandeln:
Text=BytesToString(Buffer, 0, Buffer.Length, "UTF8")

Das, Buffer = Text.GetBytes("UTF8")oder Buffer = Text.GetBytes("Windows 1252"), funktioniert nicht, die Funktion nimm an dass der Text schon im UTF-8 Format ist.
 
Last edited:

J.Schröder

Member
Licensed User
B4X:
#Event: NewText (Text As String)
#Event: Terminated

'version: 1.00
'Class module
Sub Class_Globals
    Private mTarget As Object
    Private mEventName As String
    Private astreams As AsyncStreams
    Public charset As String = "UTF8"
    Private sb As StringBuilder
End Sub

Public Sub Initialize (TargetModule As Object, EventName As String, In As InputStream, out As OutputStream)
    mTarget = TargetModule
    mEventName = EventName
    astreams.Initialize(In, out, "astreams")
    sb.Initialize
End Sub

'Sends the text. Note that this method does not add end of line characters.
Public Sub Write(Text As String)
    astreams.Write(Text.GetBytes(charset))
End Sub

Private Sub astreams_NewData (Buffer() As Byte)
    Dim newDataStart As Int = sb.Length
    sb.Append(BytesToString(Buffer, 0, Buffer.Length, charset))
    Dim s As String = sb.ToString
    Dim start As Int = 0
    For i = newDataStart To s.Length - 1
        Dim c As Char = s.CharAt(i)
            If i = 0 And c = Chr(10) Then '\n...
            start = 1 'might be a broken end of line character
            Continue
        End If
        If c = Chr(10) Then '\n
            CallSubDelayed2(mTarget, mEventName & "_NewText", s.SubString2(start, i))
            start = i + 1
        Else If c = Chr(13) Then '\r
            CallSubDelayed2(mTarget, mEventName & "_NewText", s.SubString2(start, i))
            If i < s.Length - 1 And s.CharAt(i + 1) = Chr(10) Then '\r\n
                i = i + 1
            End If
            start = i + 1
        End If
    Next
    If start > 0 Then sb.Remove(0, start)
End Sub
Private Sub astreams_Terminated
    CallSubDelayed(mTarget, mEventName & "_Terminated")
End Sub

Private Sub astreams_Error
    Log("error: " & LastException)
    astreams.Close
    CallSubDelayed(mTarget, mEventName & "_Terminated")
End Sub

Public Sub Close
    astreams.Close
End Sub
 

klaus

Expert
Licensed User
Longtime User
Versuche mal diese Zeile:
sb.Append(BytesToString(Buffer, 0, Buffer.Length, charset))
so umzusetzen:
sb.Append(BytesToString(Buffer, 0, Buffer.Length, "Windows-1252"))
oder so:
sb.Append(BytesToString(Buffer, 0, Buffer.Length, "ISO-8859-1"))
 
Top