xsharp.eu • Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer
Page 1 of 3

Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer

Posted: Wed May 22, 2024 2:44 pm
by pemo18
Hallo Zusammen,

Unsere Dbf-Datei, die per DBServer angesprochen wird, soll auch polnische Zeichen richtig speichern.

Aktuell wird aus einem Čapek leider ein Capek.

Leider kenne ich mich in der xBase-Welt zu wenig aus, um beurteilen zu können, ob dies eine prinzipielle Einschränkung ist, ob es an der Dbf-Datei liegt, oder ob die DBServer Klasse eine Property bietet (habe in der Doku nichts gefunden).

Laut

https://dbf-software.com/dbf-file-encoding

lässt sich das Encoding setzen. Die Frage wäre, wie es mit DBServer geht.

Bei RDD gibt es die DbfHeader Klasse mit einer Codepage Property. Darüber ließe sich die Codepage setzen. Mir fehlt im Moment allerdings der Zusammenhang zur DBServer Klasse.

Wenn jemand einen Tipp oder das Problem vielleicht sogar gelöst hat, würde ich mich über einen Hinweis freuen.

Danke und viele Grüße,

Peter

Re: Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer

Posted: Wed May 22, 2024 4:01 pm
by Chris
Hi Peter,

What is the SetAnsi() setting that you are using? And is the System Locale in your windows system settings set to Polish? If it is an OEM dbf, then it might be related to a similar problem we found recently and will be fixed in the next X# release (soon), so please give it a try again then.

Re: Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer

Posted: Thu May 23, 2024 7:37 am
by pemo18
Hello Chris,

I didn't know about SetAnsi(). It returns just True.

What I want is that a name with polish characters that is written into the dbf with FieldPut can be read again with FieldGet like

oTest:FIELDPUT("Name","Anton Čapek")

and later

var name := oTest:FIELDGET("Name")
? name

This outputs only "Anton Capek"

I have created the dbf file through the Ole Db provider.

Changing the system setting is not an option. It works with SQL Server etc. but not with the addresses in our dbf file.

Thank you and kind regards,
Peter

Re: Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer

Posted: Thu May 23, 2024 9:42 am
by Chris
Hi Peter,

Just to understand if that's what's causing the problem, what's the setting for the System Locale in windows?

Re: Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer

Posted: Thu May 23, 2024 9:45 am
by robert
Peter,
DBF files can contain only characters from the codepage that is in the DBF header.
That codepage is at (zero based) byte 29 in the DBF header.
You can find the meaning of the values in the following file:
https://github.com/X-Sharp/XSharpPublic ... /Enums.prg
If this byte is not 0x64 (Dos Eastern European) or 0xc8 (Windows Eastern European) then the value will be translated when writing.

Robert

Re: Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer

Posted: Fri May 24, 2024 7:43 am
by pemo18
Hello,

The codepage is, depending on who you ask, either 1031, 850 or 1252 (all on the same computer with different kind of queries). But its a "standard German setting".

So, would setting the codepage in the dbf header be an option?

I have tried the following sample code but it looks like it "destroys" the header:

Local dbPfad := Path.Combine(Environment.CurrentDirectory, "Polchars.dbf") As String
var dbInfo := DbOpenInfo{dbPfad, "", 0, False, False}
var dbfFile := Dbf{}
dbfFile:Open(dbInfo)
var header := DbfHeader{dbfFile}
? header:CodePage
header:CodePage := DbfHeaderCodepage.CP_DBF_WIN_EEUROPEAN
header:Write()
dbfFile:Close()

Kind regards,
Peter

Re: Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer

Posted: Fri May 24, 2024 3:52 pm
by pemo18
After trying several things with a hex editor and codepages like cp1250 and utf8 (and even used Python because it has a very good dbf module) I finally gave up.

Its looks like its not possible to save the character Č in a dbf file. And even it if were possible other characters like the umlaute would have to be saved correctly too.

Kind regards,
Peter

Re: Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer

Posted: Fri May 24, 2024 4:00 pm
by wriedmann
Hi Peter,
unfortunately a DBF file has only 8 bit characters, and most eastern European languages need own character sets to display these characters.
So, if you need to store these characters to a DBF file, you have to use the correct character set for the needed language, and of course you will loose the ability to store characters that are not covered in the selected character set.
I don't know if there are any plans to make DBFs unicode aware, but I think this will be a major work. But this is something only Robert can say.
Wolfgang

Re: Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer

Posted: Fri May 24, 2024 4:12 pm
by robert
Guys,

The Windows codepage 1250 has most eastern european characters and umlaut characters:
https://en.wikipedia.org/wiki/Windows-1250
If your DBF has the codepage byte 0xc8 then you should have no problem saving these characters.
I am not sure how you are checking if this succeeded, but if you're using the console window, then please make sure that the console also has the correct codepage.
You can set the codepage with the OutputEncoding property of the console class.

W.r.t. to Unicode in DBFs. We actually support that <g>.
If you create a DBF with the fieldtype "C:U" then we create character fields that can store unicode characters. The 'U' gets encoded in the flags field of the DbfField class. This flags field is also used to mark a field as AutoIncrement ("I:+") and several other properties.

A field declared as "C:U",8,0 will hold 8 bytes (4 unicode characters).
Please note that you should not do this for fields that are included in an index. We have not tested that yet and it will most likely not work.


Robert

Re: Verwenden polnischer Zeichen in einer Dbf-Datei mit DBServer

Posted: Mon Jun 03, 2024 6:46 am
by pemo18
Hello Robert,

>>If you create a DBF with the fieldtype "C:U" ...

How can this be done in code?

Can you share some of your infinite wisdom with us because the help file does not contain any example for DBServer (or I have overlooked it).

Right now I using plain SQL and the OLEDB provider to create the dbf file (for testing purposes):

var conString := i"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={dbPath};Extended Properties=dBase IV"
var dbCon := OleDbConnection{conString}
dbCon:Open()
// fieldtype "C:U"?
var sqlCommand := "Create Table Polchars (Name char(50), Adresse char(50), Info char(50))"
var dbCommand := OleDbCommand{sqlCommand, dbCon}
dbCommand:ExecuteNonQuery()

I would have to use the DBServer and the DBField class instead?

The name field should contain Unicode (like NVarchar for SQL Server).

And I could not set the encoding byte in the dbf header through code but only with a hex editor.

Kind regards,

Peter