GDAL GDALRATSetValueAsString()如何保存汉字(c#)?

我需要GDAL的帮助。 带有中文符号的字符串值未被正确读取/保存(C#)。

对于SAVING网格值,我们使用:
private static extern void GDALRATSetValueAsString(IntPtr handle,int row,int field,[In] [MarshalAs(UnmanagedType.LPStr)] string value); 方法(c#)保存字符串值, 似乎这个方法将字符串保存为ANSI字符串

阅读:

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

在。 示例我的字符串“银行Flamwood C2”有​​通过指针获取值的方法(在GDALRATGetValueAsString方法中使用):

 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. 

问:所以如何保存Unicode字符串(所以我可以使用这个Marshal.PtrToStringUni(指针) )或者很可能如何将Unicode字符串保存到GDALRAT (GDAL RAT – GDAL栅格属性表)?

GDAL版本:1.11.1

我试图设置CharSet = CharSet.Unicode但id没有帮助,仍然得到不正确的字符串:

 [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); 

谢谢你的帮助。

PS如果需要再次构建GDAL源文件以将字符串保存为unicode字符串,那么必须设置哪些构建参数和位置?

使用字符串时,GDAL在内部使用UTF-8编码。 这意味着在将字符串传递给GDAL之前必须将字符串转换为UTF-8。 这同样适用于GDAL输出字符串 – 在使用之前必须从UTF-8转换为本地编码。

C#使用UTF-16字符串,因此必须引入转换为UTF-8并返回:

 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); } } 

回到您的问题,如果将应用编码转换,将正确处理日语字符。

  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; } 

首先阅读指定字符集 。 确保有GDALRATGetValueAsString的unicode版本。 Unicode版本以W结尾,例如GDALRATGetValueAsStringW。 ANSI版本以A结尾,例如GDALRATGetValueAsStringA。 如果导入GDALRATGetValueAsString,则charset为auto。 目前尚不清楚您所指的function版本。