将_TCHAR *转换为char * [英] Converting _TCHAR* to char*

查看:239
本文介绍了将_TCHAR *转换为char *的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要一个简单的OpenCV示例在Windows和我的C ++上使用C ++是非常生锈。



示例非常简单:

  #include< opencv2 / core / core.hpp> 
#include< opencv2 / highgui / highgui.hpp>
#include< iostream>

using namespace cv;
using namespace std;

int main(int argc,char ** argv)
{
if(argc!= 2)
{
cout<用法:display_image ImageToLoadAndDisplay< endl;
return -1;
}
Mat image;
image = imread(argv [1],IMREAD_COLOR); //读取文件
if(!image.data)//检查无效的输入
{
cout< 无法打开或找到图像< std :: endl;
return -1;
}
namedWindow(Display window,WINDOW_AUTOSIZE); //创建一个用于显示的窗口。
imshow(Display window,image); //在里面显示我们的图片。
waitKey(0); //等待窗口中的击键
return 0;当我在Visual Studio中创建一个新的简单的C ++控制台应用程序(使用ATL)时,
}


$ b 2012我得到一个不同的模板 main

  int _tmain argc,_TCHAR * argv [])

所以在我将文件名发送到OpenCV的 imread 函数我需要将 _TCHAR * arg [1] code> char * 。使用简单的文件名'opencv-logo.jpg',从内存窗口的内存中我可以看到_TCHAR每个都占用两个字节。

  opencv-.logo..jpg .. 
6f 00 70 00 65 00 6e 00 63 00 76 00 2d 00 6c 00 6f 00 67 00 6f 00 2e 00 6a 00 70 00 67 00 00 00

按照另一个答案我试图使用 ATL 7.0字符串转换类和宏插入以下代码:

  char * filename = CT2A (argv [1]); 

但是生成的内存是一个混乱,肯定不是'opencv-logo.jpg'as ascii字符串:

  fe fe fe fe fe fe fe fe fe ... 
þþþþþþþþþþ...



我应该使用哪种转换技术,功能或宏?



(NB 可能是相关问题,但我看不到如何应用此处的答案。)

解决方案

最快的解决方案是只是将签名更改为标准。替换:

  int _tmain(int argc,_TCHAR * argv [])
/ pre>

使用

  int main(int argc,char * argv [])

这意味着在Windows上命令行参数被转换为系统的语言环境编码并且由于Windows不支持UTF-8这里不是一切转换正确。但是,除非你真的需要国际化,否则你的时间可能不值得再做。


I'm trying to get a simple OpenCV sample working in C++ on Windows and my C++ is more than rusty.

The sample is fairly simple:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
    if( argc != 2)
    {
        cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
        return -1;
    }
    Mat image;
    image = imread(argv[1], IMREAD_COLOR); // Read the file
    if(! image.data )                      // Check for invalid input
    {
        cout <<  "Could not open or find the image" << std::endl ;
        return -1;
    }
    namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
    imshow( "Display window", image );                // Show our image inside it.
    waitKey(0); // Wait for a keystroke in the window
    return 0;
}

When I make a new simple C++ console application (with ATL) in Visual Studio 2012 I get a different template for main:

int _tmain( int argc, _TCHAR* argv[] )

So before I send the filename to OpenCV's imread function I need to convert the _TCHAR* arg[1] to a char*. Using a simple filename, 'opencv-logo.jpg', from the memory in the memory window I can see that the _TCHAR are taking two bytes each

o.p.e.n.c.v.-.l.o.g.o...j.p.g...
6f 00 70 00 65 00 6e 00 63 00 76 00 2d 00 6c 00 6f 00 67 00 6f 00 2e 00 6a 00 70 00 67 00 00 00

Following the conversion recommendation in another answer I am trying to use ATL 7.0 String Conversion Classes and Macros by inserting the following code:

char* filename = CT2A(argv[1]);

But the resulting memory is a mess, certainly not 'opencv-logo.jpg' as an ascii string:

fe fe fe fe fe fe fe fe fe fe ...
þþþþþþþþþþ ...

Which conversion technique, function, or macro should I be using?

(N.B. This may be a related question but I cannot see how to apply the answer here.)

解决方案

The quickest solution is to just change the signature to the standard one. Replace:

int _tmain( int argc, _TCHAR* argv[] )

With

int main( int argc, char *argv[] )

This does mean on Windows that the command line arguments get converted to the system's locale encoding and since Windows doesn't support UTF-8 here not everything converts correctly. However unless you actually need internationalization then it may not be worth your time to do anything more.

这篇关于将_TCHAR *转换为char *的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆