字符集WideCharToMultiByte
GDAL C#封装对中文字符转换过程中存在问题。
C++封装一个Win32 DLL,采用Unicode字符集。使用标准头文件。
https://msdn.microsoft.com/en-us/library/dd319072(VS.85).aspx
class CodePageHelper
{
public:
CodePageHelper(void);
~CodePageHelper(void);
static wchar_t* ANSIToUnicode( const char* str );
static char* UnicodeToANSI( const wchar_t* str );
static wchar_t* UTF8ToUnicode( const char* str );
static char* UnicodeToUTF8( const wchar_t* str );
};
CodePageHelper.h
#include "StdAfx.h"
#include "CodePageHelper.h" CodePageHelper::CodePageHelper(void)
{
} CodePageHelper::~CodePageHelper(void)
{
} // ANSI to Unicode
wchar_t* CodePageHelper:: ANSIToUnicode( const char* str )
{
int unicodeLen = ::MultiByteToWideChar( CP_ACP,
,
str,
-,
NULL,
);
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+];
memset(pUnicode,,(unicodeLen+)*sizeof(wchar_t));
::MultiByteToWideChar( CP_ACP,
,
str,
-,
(LPWSTR)pUnicode,
unicodeLen );
wchar_t* rt;
rt = ( wchar_t* )pUnicode;
//delete pUnicode; return rt;
}
// Unicode to ANSI
char* CodePageHelper:: UnicodeToANSI( const wchar_t* str )
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_ACP,
,
str,
-,
NULL,
,
NULL,
NULL );
pElementText = new char[iTextLen + ];
memset( ( void* )pElementText, , sizeof( char ) * ( iTextLen + ) );
::WideCharToMultiByte( CP_ACP,
,
str,
-,
pElementText,
iTextLen,
NULL,
NULL );
char* strText;
strText = pElementText;
//delete[] pElementText;
return strText;
}
// UTF-8 to Unicode
wchar_t* CodePageHelper::UTF8ToUnicode( const char* str )
{
int unicodeLen = ::MultiByteToWideChar( CP_UTF8,
,
str,
-,
NULL,
);
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+];
memset(pUnicode,,(unicodeLen+)*sizeof(wchar_t));
::MultiByteToWideChar( CP_UTF8,
,
str,
-,
(LPWSTR)pUnicode,
unicodeLen );
wchar_t* rt;
rt = ( wchar_t* )pUnicode;
//delete pUnicode; return rt;
}
// Unicode to UTF-8 char* CodePageHelper::UnicodeToUTF8( const wchar_t* str )
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_UTF8,
,
str,
-,
NULL,
,
NULL,
NULL );
pElementText = new char[iTextLen + ];
memset( ( void* )pElementText, , sizeof( char ) * ( iTextLen + ) );
::WideCharToMultiByte( CP_UTF8,
,
str,
-,
pElementText,
iTextLen,
NULL,
NULL );
char* strText;
strText = pElementText;
//delete[] pElementText;
return strText;
}
CodePageHelper
#ifdef DEMIMP_EXPORTS
#define CPL_DLL __declspec(dllexport)
#else
#define CPL_DLL __declspec(dllimport)
#endif #ifndef CPL_DISABLE_STDCALL
# define CPL_STDCALL __stdcall
#endif extern "C"
{
HANDLE CPL_DLL WINAPI GetMetaData(LPWSTR filepath);
};
GDALRaster.h
HANDLE CPL_DLL WINAPI GetMetaData(LPWSTR filepath)
{
//char* file=CodePageHelper::UnicodeToUTF8((const wchar_t*)filepath); char* file1=CodePageHelper::UnicodeToANSI((const wchar_t*)filepath);
//const wchar_t* file2=filepath;
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
GDALDataset *pDSrc = (GDALDataset *)GDALOpen(file1, GA_ReadOnly);
if (pDSrc == NULL)
{
return ;
}
char** metadata=pDSrc->GetMetadata("");
return metadata;
}
C# P/Invoke调用:
  [DllImport("GDALRaster.dll", EntryPoint = "GetMetaData", CharSet = CharSet.Unicode)]
         private static extern IntPtr CSharp_GetMetadata([In, MarshalAs(UnmanagedType.LPWStr)]string filepath);
解析字符串:
public static string[] GetMetaData(string filePath)
{
IntPtr cPtr = CSharp_GetMetadata(filePath);
if (cPtr == IntPtr.Zero) throw new Exception("打开失败"); IntPtr objPtr;
int count = ;
if (cPtr != IntPtr.Zero)
{
while (Marshal.ReadIntPtr(cPtr, count * IntPtr.Size) != IntPtr.Zero)
++count;
}
string[] ret = new string[count];
if (count > )
{
for (int cx = ; cx < count; cx++)
{
objPtr = System.Runtime.InteropServices.Marshal.ReadIntPtr(cPtr, cx * System.Runtime.InteropServices.Marshal.SizeOf(typeof(IntPtr)));
ret[cx] = (objPtr == IntPtr.Zero) ? null : System.Runtime.InteropServices.Marshal.PtrToStringAnsi(objPtr);
}
}
return ret;
//double[] temp = new double[xsize * ysize];
//Marshal.Copy(pData, temp, 0, xsize * ysize);
//FreeData(pData);
//return temp; }
字符集WideCharToMultiByte的更多相关文章
- 关于多字节、宽字节、WideCharToMultiByte和MultiByteToWideChar函数的详解
		所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码. 而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE. **************************** ... 
- Unicode字符集下CString与char *转换 (解决中文乱码等)(转)
		UniCode 下 CString 转 char* 的方法的文章有很多,但是大部分都是在互相转载,看了那么多资料,仍然没有解决乱码的问题,后来从一个论坛的一条回复里面找到了正确的方法,特此拿出来与大家 ... 
- MULTIBYTETOWIDECHAR的与WIDECHARTOMULTIBYTE的参数详解及相互转换
		第一个就是宽字符到多字节字符转换函数,函数原型如下: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideChar ... 
- Windows字符集的统一与转换
		以前也零零散散看过一些字符编码的问题,今天看来这边博客,感觉很多东西都总结在里面,非常值得学习! 一.字符集的历史渊源 在Windows编程时经常会遇到编码转换的问题,一直以来让刚接触的人摸不着头脑. ... 
- 函数WideCharToMultiByte() 详解
		函数原型: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPWSTR lpWideCharStr, int cchWideChar, ... 
- 字符集转换: Unicode - Ansi
		字符集转换: Unicode - Ansi string UnicodeToAnsi ( const wstring& wstrSrc ) { /*!< 分配目标空间, 一个16位Uni ... 
- MultiByteToWideChar和WideCharToMultiByte用法详解
		今天写ini文件的时候发现的问题: TCHAR temp[]; //strcpy_s(temp, request.newVersion); MultiByteToWideChar(CP_ACP, , ... 
- 转:Unicode字符集和多字节字符集关系
		原文地址: http://my.oschina.net/alphajay/blog/5691 unicode.ucs-2.ucs-4.utf-16.utf-32.utf-8 http://stallm ... 
- Unicode字符集下CString与char *相互转换
		经常遇到CString转换char*时只返回第一个字符.原因是因为在Unicode字符集下CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符.所以直接转换在基于MBCS的 ... 
随机推荐
- 重命名Administrator账号
			(Get-WmiObject -class Win32_UserAccount | where {$_.SID -Like 'S-1-5-*-500'}).Rename("Ultraman& ... 
- NBUT 1010 魔法少女(DP)
			[1010] 魔法少女 时间限制: 1000 ms 内存限制: 65535 K 问题描述 前些时间虚渊玄的巨献小圆着实火了一把. 在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙. ... 
- 送给使用phpstorm+thinkphp开发者的福利
			送给使用phpstorm+thinkphp开发者的福利 记得两年前的这个时候,我开始学习php.我选择了thinkphp入门,写了我的第一个简单的cms.当时我什么都不懂,但是这里的技术氛围好的, ... 
- 低功耗蓝牙4.0BLE编程-nrf51822开发(8)-GATT
			The Generic Attribute Profile (GATT)使用属性定义一个服务框架,定义了服务和特性的过程和数据格式,包含发现.读取.写入.通知指示特性和配置特性广播. GATT配置文件 ... 
- FW Docker为容器分配指定物理网段的静态IP
			官方有关于网桥和IP配置的文档地址:https://docs.docker.com/articles/networking/ 1.宿主机(系统采用ubuntu-14.04.1-server-amd64 ... 
- Java迭代 : Iterator和Iterable接口
			从英文意思去理解 Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的.able结尾的表示 能...样,可以做.... Iterator: 在英语中or 结尾是都是表示 .. ... 
- angularjs select 循环中出现第一个 option 为空格问题
			当select 的ng-module 为空时, select显示空白行. 解决:指定ng-module的默认值. 
- 理解tornado
			计算密集型:多进程 IO密集型:多线程 能产生IO阻塞的情况很多,比如网络通讯.磁盘读写.当发生阻塞时,CPU是闲置的,此时如果就一个线程就没法处理其他事情了. 所以对于含有IO阻塞的环境,多线程 ... 
- php--group_concat()函数总结
			group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果. 比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组 ... 
- Wordpress页面判断
			is_single() 判断是否是文章页面 is_single('2')/is_single(2)判断是否是具体文章(id=2)的页面 is_single('')判断是否是具体文章(标题为Beef S ... 
