C# 如何在日文视窗操作系统中编码日文文本?

C# 如何在日文视窗操作系统中编码日文文本?,c#,c++,encoding,tesseract,C#,C++,Encoding,Tesseract,我使用Tesseract阅读日本文本。我正在从OCR获取以下文本 æ-ääèæ書 C++代码 extern "C" _declspec(dllexport) char* _cdecl Test(char* imagePath) { char *outText; tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI(); // Initialize tesseract-ocr

我使用Tesseract阅读日本文本。我正在从OCR获取以下文本

æ-ääèæ書

C++代码

 extern "C" _declspec(dllexport) char* _cdecl Test(char* imagePath)
    {
        char *outText;

        tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
        // Initialize tesseract-ocr with English, without specifying tessdata path
        if (api->Init("D:\\tessdata", "jpn", tesseract::OcrEngineMode::OEM_TESSERACT_ONLY))
        {
            fprintf(stderr, "Could not initialize tesseract.\n");           
        }

        api->SetPageSegMode(tesseract::PageSegMode::PSM_AUTO);      
        outText = api->GetUTF8Text();

        return outText;
    }
c#

输入文件:

以上代码在Windows英语中运行良好。但它在日本不起作用。它在window的日本操作系统中给出了错误的输出


有谁能指导我如何在Japanes窗口中正确使用它吗?

您正在向非UTF-8的窗口发送UTF-8文本。 您需要在显示之前进行转换

这是可能导致问题的代码(因为它试图使用您无法控制的默认系统编码); byte[]bytes=System.Text.Encoding.Default.GetBytes(结果)

你试过在那里使用Encoding.UTF8吗

如果这一点不起作用,试着改变
Encoding.UTF8改为Encoding。以下行中的默认值也是。

outText似乎已经是UTF-8格式

outText = api->GetUTF8Text();
现在。。。从C++返回字节[]/COD>(或类似)是一种痛苦…改为:

[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr Test(string imagePath);
然后将
StringFromNativeUtf8
from(因为即使将
IntPtr
转换为UTF-8 c字符串也是一件痛苦的事情……NET在本机上也没有类似的功能):

然后您必须释放
IntPtr
。。。另一种痛苦

[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
public static extern void Free(IntPtr ptr);


必须首先从imagePath创建图像对象

在我的例子中,这是通过使用著名的opencv来完成的。 然后,使用SetImage函数

void detectJpn(cv::Mat& img)
{
    char *outText;

    // Create Tesseract object
    tesseract::TessBaseAPI *ocr = new tesseract::TessBaseAPI();

    ocr->Init(NULL, "jpn", tesseract::OEM_TESSERACT_ONLY);

    // Set Page segmentation mode to PSM_AUTO (3)
    ocr->SetPageSegMode(tesseract::PSM_AUTO);

    ocr->SetImage((uchar*)img.data, img.size().width, img.size().height, img.channels(), img.step1());

    // Run Tesseract OCR on image
    outText = ocr->GetUTF8Text();

    // print recognized text
    std::cout << outText << std::endl; // Destroy used object and release memory ocr->End();

    //ocr->Clear();
    //ocr->End();

    delete ocr;
    ocr = nullptr;
}


int main(int argc, char *argv[])
{
    cv::Mat img = imread(argv[1], cv::IMREAD_UNCHANGED);

    detectJpn(img);     

    return 0;
}
void detectJpn(cv::Mat和img)
{
字符*输出文本;
//创建Tesseract对象
tesseract::TessBaseAPI*ocr=新的tesseract::TessBaseAPI();
ocr->Init(空,“jpn”,tesseract::OEM\u tesseract\u仅限);
//将页面分割模式设置为PSM_AUTO(3)
ocr->SetPageSegMode(tesseract::PSM_AUTO);
ocr->SetImage((uchar*)img.data,img.size().width,img.size().height,img.channels(),img.step1());
//在图像上运行Tesseract OCR
outText=ocr->GetUTF8Text();
//打印识别文本
std::cout Clear();
//ocr->End();
删除ocr;
ocr=空PTR;
}
int main(int argc,char*argv[])
{
cv::Mat img=imread(argv[1],cv::imread_不变);
检测jpn(img);
返回0;
}

我想您应该给它UTF-16而不是UTF-8,因为winapi主要处理这个问题。。。我猜?文本中是否有BOM表来说明它是什么类型的?如果没有,请尝试UTF-8或Shift JIS。我已经尝试了UTF-8和Shift JIS。但这对你的建议没有帮助?byte[]bytes=System.Text.Encoding.UTF8.GetBytes(result);Show(System.Text.Encoding.UTF8.GetString(字节));
[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
public static extern void Free(IntPtr ptr);
extern "C" _declspec(dllexport) void _cdecl Free(char* ptr)
{
    delete[] ptr;
}
void detectJpn(cv::Mat& img)
{
    char *outText;

    // Create Tesseract object
    tesseract::TessBaseAPI *ocr = new tesseract::TessBaseAPI();

    ocr->Init(NULL, "jpn", tesseract::OEM_TESSERACT_ONLY);

    // Set Page segmentation mode to PSM_AUTO (3)
    ocr->SetPageSegMode(tesseract::PSM_AUTO);

    ocr->SetImage((uchar*)img.data, img.size().width, img.size().height, img.channels(), img.step1());

    // Run Tesseract OCR on image
    outText = ocr->GetUTF8Text();

    // print recognized text
    std::cout << outText << std::endl; // Destroy used object and release memory ocr->End();

    //ocr->Clear();
    //ocr->End();

    delete ocr;
    ocr = nullptr;
}


int main(int argc, char *argv[])
{
    cv::Mat img = imread(argv[1], cv::IMREAD_UNCHANGED);

    detectJpn(img);     

    return 0;
}