2015-10-23 14 views
10

Ho bisogno di aiuto con GDAL. Il valore stringa con simboli cinesi non viene letto/salvato correttamente (C#).GDAL GDALRATSetValueAsString() come salvare i caratteri cinesi (C#)?

Per RISPARMIO valore griglia si utilizza:
static GDALRATSetValueAsString vuoto extern privato (maniglia IntPtr, fila int, campo int [In] [MarshalAs (UnmanagedType.LPStr)] valore di stringa); metodo (C#) per salvare il valore stringa, sembra che questo metodo salva stringa come stringa ANSI.

per la lettura:

private static extern IntPtr GDALRATGetValueAsString(IntPtr handle, int row, int field); 

In. Esempio mia stringa "银行 Flamwood C2" C'è per i metodi per ottenere valore puntatore (uso in GDALRATGetValueAsString metho):

var pointer = GDALRATGetValueAsString(GDALRasterAttributeTableH, row, field); 
    a) var b = Marshal.PtrToStringUni(pointer);  // value: "㼿汆浡潷摯䌠2" 
    b) var a = Marshal.PtrToStringAnsi(pointer);  // value: "??Flamwood C2" 
    c) var c = Marshal.PtrToStringAuto(pointer);  // value: "㼿汆浡潷摯䌠2" 
    d) var d = Marshal.PtrToStringBSTR(pointer);  //Throws an error out of memory. 

D: Allora, come posso ottenere stringa Unicode con è stato salvato (così posso ottenere utilizzando questo Marshal.PtrToStringUni (puntatore)) o molto probabilmente come salvare la stringa Unicode su GDALRAT (GDAL RAT - Tabella attributi raster GDAL)?

versione GDAL: 1.11.1

ho cercato di impostare charset = CharSet.Unicode ma ID non ha aiutato, ancora ottenere non corretto stringa:

[DllImport(GdalWrapper.GdalDLL, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] 
private static extern void GDALRATSetValueAsString(IntPtr handle, int row, int field, [In][MarshalAs(UnmanagedType.LPStr)] string value); 

Grazie per qualsiasi aiuto.

P.S. Se i file di origine GDAL devono essere di nuovo creati per salvare la stringa come stringa unicode, quali sono i parametri di costruzione e dove deve essere impostato?

+1

Trovato questo collegamento: https://trac.osgeo.org/gdal/wiki/rfc5_unicode. Forse c'è un modo facile (questo articolo è stato scritto 5 anni fa ...)? – Drasius

+0

Anche ticket creato: https://trac.osgeo.org/gdal/ticket/6168#ticket – Drasius

+0

incolla la tua soluzione –

risposta

2

GDAL utilizza la codifica UTF-8 internamente quando si lavora con le stringhe. Ciò significa che le stringhe devono essere convertite in UTF-8 prima di passarle a GDAL. Lo stesso è valido per le stringhe di output GDAL - deve essere convertito da UTF-8 alla codifica locale prima dell'uso.

C# utilizza UTF-16 stringhe in modo conversioni a UTF-8 e viceversa devono essere introdotti:

public class EncodingConverter 
{ 
    public static string Utf16ToUtf8(string utf16String) 
    { 
     byte[] utf16Bytes = Encoding.Unicode.GetBytes(utf16String); 
     byte[] utf8Bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, utf16Bytes); 
     return Encoding.Default.GetString(utf8Bytes); 
    } 

    public static string Utf8ToUtf16(string utf8String) 
    { 
     byte[] utf8Bytes = Encoding.Default.GetBytes(utf8String); 
     byte[] utf16Bytes = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, utf8Bytes); 
     return Encoding.Unicode.GetString(utf16Bytes); 
    } 
} 

Tornando al tuo problema, i caratteri giapponesi saranno trattati correttamente se verrà applicata la conversione di codifica.

public void SetValueAsString(int row, int field, string value) 
    { 
     string utf8Value = EncodingConverter.Utf16ToUtf8(value); 
     GDALRATSetValueAsString(GDALRasterAttributeTableH, row, field, utf8Value); 
    } 

    public string GetValueAsString(int row, int field) 
    { 
     string value = null; 

     var pointer = GDALRATGetValueAsString(GDALRasterAttributeTableH, row, field); 
     if (pointer != IntPtr.Zero) 
     { 
      string utf8Value = Marshal.PtrToStringAnsi(pointer); 
      value = EncodingConverter.Utf8ToUtf16(utf8Value); 
     } 
     return value; 
    } 
0

Leggere questo primo Specifying a Character Set. Assicurarsi che ci sia una versione unicode di GDALRATGetValueAsString. La versione Unicode termina con una W ad es. GDALRATGetValueAsStringW. La versione ANSI termina con un A ad es. GDALRATGetValueAsStringA. Se si importa GDALRATGetValueAsString, il set di caratteri è automatico. Non è chiara la versione della funzione a cui ci si sta riferendo.

+1

Guardando l'API dell'API http: //www.gdal.org/gdal_8h.html sembra essere una stringa ANSI che viene restituita, perché è un const char *. È necessaria una funzione wrapper per convertire la stringa ANSI in Unicode. Per esempio. MultiByteToWideChar https://msdn.microsoft.com/en-us/library/windows/desktop/dd319072(v=vs.85).aspx. –