GDAL GDALRATSetValueAsString() 如何保存汉字(c#)?
GDAL GDALRATSetValueAsString() how to save Chinese characters (c#)?
我需要 GDAL 方面的帮助。带有中文符号的字符串值不正确readed/saved (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 Raster Attribute Table)?
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);
感谢您的帮助。
P.S.如果需要重新构建GDAL源文件以将字符串保存为unicode字符串,那么必须设置哪些构建参数以及在哪里设置?
先阅读这篇文章 Specifying a Character Set。
确保有一个 unicode 版本的 GDALRATGetValueAsString。
Unicode 版本以 W 结尾,例如GDALRATGetValueAsStringW。
ANSI 版本以 A 结尾,例如GDALRATGetValueAsStringA。
如果你导入 GDALRATGetValueAsString 字符集是自动的。
不清楚你指的是哪个版本的函数。
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;
}
我需要 GDAL 方面的帮助。带有中文符号的字符串值不正确readed/saved (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 Raster Attribute Table)?
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);
感谢您的帮助。
P.S.如果需要重新构建GDAL源文件以将字符串保存为unicode字符串,那么必须设置哪些构建参数以及在哪里设置?
先阅读这篇文章 Specifying a Character Set。 确保有一个 unicode 版本的 GDALRATGetValueAsString。 Unicode 版本以 W 结尾,例如GDALRATGetValueAsStringW。 ANSI 版本以 A 结尾,例如GDALRATGetValueAsStringA。 如果你导入 GDALRATGetValueAsString 字符集是自动的。 不清楚你指的是哪个版本的函数。
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;
}