[Gambas-user] Problem with Conv() and XmlWrite

Luigi Carlotto md9327 at ...120...
Sun Dec 14 13:08:36 CET 2008


In my application I execute a rescue on XML file of some data.
The rescue executes before a conversion: Conv (string, “UTF-8”, “ASCII”)
During my tests, I have noticed that some errors are taken place:
1) if the string is larger than 2000 characters (approximately),
XmlWrite.Attribute() crash;
2) if the language comes set up to Chinese (UTF-8), the conversion with
Conv() crash; same behavior if is used XmlWrite.Attribute(), or
XmlWrite.Element(), without to execute conversions.
I have noticed that the errors take place alone if System.Language=zh_CN
and System.Charset=UTF-8, while with various languages seems to go all
good.

Error message:

encoding error : output conversion failed due to conv error, bytes 0xE5
0x31 0x32 0xE5
I/O error : encoder error

The bytes indicated from the message they do not seem to correspond,
neither are comprised, in no string between those which they come saved
in XML file.

To notice that the reading from XML file is OK, while the writing
finishes with the error described in mine precedence mail, if the
writing of XML file with System.Language=zh_CN (Chinese); with other
languages (Italian, French, English and Spanish) it is all to OK.
>From some tests it begins them seemed that the anomaly depended also
from the dimensions of the string, but this had to cause the crash also
with the other formulations, what that instead does not happen. The
strange thing that I have noticed, is that the dimensions of the content
of the string, with Language=zh_CN, are much smaller of the usual; I
imagine that this depends from as the String object it manages the data,
but that turns out me also the Chinese characters use advanced values to
256.

In any case, the application is too much large and complex for being
sent and described in a mail… However, the errors take place (DEBUG) in
the Save() method, for which at the moment shipment only the functions
interested. If they serve more information, no problems.

The function toString () works OK, and returns the attended string, but
the conversion finishes then in error.

'---
' Save settings
'
PUBLIC SUB Save()
  DIM oGroup AS pgConfigGroup
  DIM oItem AS pgConfigItem
  DIM oXml AS XmlWriter
  'open file for writing
  oXml = NEW XmlWriter
  oXml.Open($filename, TRUE, "UTF8")
  'write header
  oXml.StartElement(pgApplication.Name)
  oXml.Attribute("Type", Str("Config"))
  oXml.Attribute("Version", pgUtil.SetVersion(VERSION))
  oXml.Attribute("Date", Str(Now()))
  'write elements
  FOR EACH oGroup IN $data
    oXml.StartElement(oGroup.Name)
    FOR EACH oItem IN oGroup.Items
      oXml.Attribute(oItem.Name, Conv(oItem.toString(), "UTF-8",
"ASCII"))
    NEXT 
    oXml.EndElement
  NEXT 
  'write footer
  oXml.EndElement
  oXml.EndDocument
END
...
...
...
'---
' Convert any value into single string
'
PUBLIC FUNCTION toString() AS String
  DIM iPos AS Integer
  DIM aText AS String[]
  SELECT CASE $type
  CASE TYPE_STRING 'gb.String
    RETURN Str(IIf(IsNull($value), "", $value))
  CASE TYPE_INTEGER 'gb.Integer
    RETURN Str(IIf(IsNull($value), "0", $value))
  CASE TYPE_BOOLEAN 'gb.Boolean
    RETURN Str(IIf(IsNull($value), "false", IIf($value, "true",
"false")))
  CASE TYPE_STRINGARRAY 'String[] object
    IF (IsNull($value)) OR IF ($value.Count = 0) THEN RETURN Str("")
    RETURN Str($value.Join(","))
  CASE TYPE_INTEGERARRAY 'Integer[] object
    IF (IsNull($value)) OR IF ($value.Count = 0) THEN RETURN Str("")
    aText = NEW String[]
    FOR EACH iPos IN $value
      aText.Add(Str(iPos))
    NEXT 
    RETURN Str(aText.Join(","))
  CASE TYPE_COLOR 'custom color object
    RETURN Str(IIf(IsNull($value), "0,0,0", pgColor.ColorToStr($value)))
  END SELECT 
END

Help?



More information about the User mailing list