ZInt支持中文例子

/*
2018-10-10 10:01:15
编译Zint 在VS2017的环境下
*/
参考:https://blog.youkuaiyun.com/weiwei9363/article/details/81196646

补充:
在编译过程中 出了上述文章所没有提及的问题
还会出现 zlib.h文件无法找到的问题;解决办法:将文件夹zlib-1.2.8中的h文件拷贝到lPng中

关于使用zint进行条码的生成:(API的使用)
http://www.zint.org.uk/Manual.aspx?type=p&page=5
详细的介绍了zint的使用方法

zint_symbol结构体 包含了生成条码图片的详细信息,结构体定义如下
struct zint_symbol
{
    int symbology;            //条码类型    默认:BARCODE_CODE128
    int height;                //条码高度    默认:50
    int whitespace_width;    //空白宽度    默认:0
    int border_width;        //边框宽度    默认:0
    int output_options;        //设置输出方式(输出条码图片的增加元素) 默认:0
    char fgcolour[10];        //前景色 颜色为RGB十六进制字符串必须是6个字符 "000000" 黑色
    char bgcolour[10];        //背景色 "FFFFFF" 白色
    char outfile[256];        //输出条码的名称,包括后缀名;后缀名可选(.png,.bmp,.gif,.eps,.pcx,.svg或.txt)
    float scale;            //调整图像大小比例    默认:1.0
    int option_1;
    int option_2;
    int option_3;
    int show_hrt;            //设置为1 显示文本在条码图片下面 设置为0 则不显示
    int fontsize;
    int input_mode;            //设置输入数据的编码模式    默认:UNICODE_MODE
    int eci;                //扩展通道解释模式        默认:3
    unsigned char text[128];    //可读的文本    默认:NULL
    int rows;                    //输出的行数
    int width;                    //输出的宽
    char primary[128];            //复杂条码的主要数据    默认:NULL
    unsigned char encoded_data[200][143];    //输出的编码数据
    int row_height[200];     //输出一行的高度
    char errtxt[100];        //发生错误时 输出的错误信息
    char *bitmap;            //输出指向位图的指针
    int bitmap_width;        //输出位图的宽
    int bitmap_height;        //输出位图的高
    unsigned int bitmap_byte_length;
    float dot_size;            //使用点输出模式下 点的大小
    struct zint_render *rendered;
    int debug;
};


关于使用Zint支持中文的问题,解决方案
转换成UTF8支持即可
包含几个互相转换的函数

UnicodeToAscii
AsciiToUnicode

Unicode转换成UTF8
std::string UnicodeToUTF8(const std::wstring& str)
{
    char *pElementText;
    int iTextLen = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), -1, NULL, 0, NULL, NULL);
    pElementText = new char[iTextLen + 1];
    memset((void*)pElementText, 0, sizeof(char) * (iTextLen + 1));
    ::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), -1, pElementText, iTextLen, NULL, NULL);
    std::string strText = pElementText;
    delete[] pElementText;
    return strText;
}


ASCII码直接转换成UTF8
std::string ASCToUTF8(const std::string& str)
{
    int unicodeLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
    wchar_t *pUnicode = new  wchar_t[unicodeLen + 1];
    memset(pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t));
    ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, (LPWSTR)pUnicode, unicodeLen);
    std::wstring wrt = (wchar_t*)pUnicode;
    delete  pUnicode;

    int iTextLen = WideCharToMultiByte(CP_UTF8, 0, wrt.c_str(), -1, NULL, 0, NULL, NULL);
    char *pElementText = new char[iTextLen + 1];
    memset((void*)pElementText, 0, sizeof(char) * (iTextLen + 1));
    ::WideCharToMultiByte(CP_UTF8, 0, wrt.c_str(), -1, pElementText, iTextLen, NULL, NULL);
    std::string strText = pElementText;
    delete pElementText;

    return strText;
}

实现的代码片段

#include "pch.h"
#include <iostream>
#include "HeadFile/zint.h"
#include <string>
#include <atlconv.h>


std::string UnicodeToUTF8(const std::wstring& str);	//
std::string ASCIIToUTF8(const std::string& str);


int main()
{
	struct zint_symbol *my_symbol = ZBarcode_Create();

	my_symbol->symbology = BARCODE_QRCODE;	//设置条码类型
	my_symbol->height = 100;
	my_symbol->border_width = 2;
	my_symbol->input_mode = DATA_MODE;	//如果需要支持中文 输入数据的模式最好设置为DATA_MODE
	strcpy(my_symbol->outfile, "mypng.png");
	
	if (NULL != my_symbol)
	{
		printf("符号成功创建!\n");
	}

	//std::string StrSource = UnicodeToUTF8(L"我可以支持中文啦");
	std::string StrSource = ASCIIToUTF8("我可以支持中文啦");
	int error = ZBarcode_Encode(my_symbol, (const unsigned char*)StrSource.c_str(), StrSource.length());
	if (0 != error)
	{
		printf("%s\n", my_symbol->errtxt);
	}
	ZBarcode_Print(my_symbol, 0);
	ZBarcode_Delete(my_symbol);


	system("pause");
	return EXIT_SUCCESS;
}

std::string ASCIIToUTF8(const std::string& str)
{
	int unicodeLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
	wchar_t *pUnicode = new  wchar_t[unicodeLen + 1];
	memset(pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t));
	::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, (LPWSTR)pUnicode, unicodeLen);
	std::wstring wrt = (wchar_t*)pUnicode;
	delete  pUnicode;

	int iTextLen = WideCharToMultiByte(CP_UTF8, 0, wrt.c_str(), -1, NULL, 0, NULL, NULL);
	char *pElementText = new char[iTextLen + 1];
	memset((void*)pElementText, 0, sizeof(char) * (iTextLen + 1));
	::WideCharToMultiByte(CP_UTF8, 0, wrt.c_str(), -1, pElementText, iTextLen, NULL, NULL);
	std::string strText = pElementText;
	delete pElementText;

	return strText;
}

std::string UnicodeToUTF8(const std::wstring& str)
{
	char *pElementText;
	int iTextLen = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), -1, NULL, 0, NULL, NULL);
	pElementText = new char[iTextLen + 1];
	memset((void*)pElementText, 0, sizeof(char) * (iTextLen + 1));
	::WideCharToMultiByte(CP_UTF8, 0, str.c_str(), -1, pElementText, iTextLen, NULL, NULL);
	std::string strText = pElementText;
	delete[] pElementText;
	return strText;
}

最后实现效果:

     

最后附上 编译好的库和例子的完整工程
链接:https://pan.baidu.com/s/1JYqzHBJLvN2lV1Z-mC1XHw 
提取码:s927.

 

有问题 请留言

<think>好的,用户让我用RStudio举个例子,来说明他们给出的系统级指令中的LaTeX格式要求。首先,我需要确认用户的需求是什么。他们可能是在使用RStudio编写文档,比如R Markdown,需要正确插入数学公式,但不太清楚如何按照指定的格式来写。 接下来,我需要回忆RStudio中处理LaTeX数学表达式的常见方法。在R Markdown文档中,用户通常会用$...$包裹行内公式,用$$...$$包裹独立公式,并单独成段。这和用户提供的系统级指令是一致的。因此,我需要举一个具体的例子,展示在R Markdown中如何正确应用这些规则。 然后,我需要确保示例中的LaTeX语法正确,比如使用正确的符号,比如积分符号\int,上下标的位置,括号的使用,以及中文注释的正确性。同时,回答需要结构清晰,分步骤说明,帮助用户理解每个部分的作用。 可能用户会遇到的问题包括:行内公式没有正确使用$符号,独立公式没有换行,或者LaTeX语法错误。因此,在示例中需要明确指出正确的格式,并对比错误写法,帮助用户避免常见错误。 另外,用户可能对如何在R Markdown中渲染数学公式不太熟悉,所以需要提到如何在RStudio中编译文档,生成PDF或HTML输出,以查看公式效果。不过用户主要关注的是LaTeX的格式,所以可能需要简要提及编译步骤,但重点还是放在正确的语法上。 最后,要确保整个回答用中文,结构清晰,步骤明确,符合用户可见层的要求。可能需要分点说明,正确示例和错误示例对比,以及编译后的效果。同时,检查是否有遗漏的系统级指令,比如所有行内公式必须用$...$,独立公式用$$...$$单独成段,确保示例中的每个公式都符合要求。 总结,我需要构建一个包含正确和错误示例的R Markdown代码片段,解释每个部分,并指出注意事项,帮助用户正确应用LaTeX格式在RStudio中编写数学公式。</think>在RStudio中使用LaTeX数学公式的示例说明: 1. 行内公式正确写法(用`$...$`包裹): ```rmarkdown 线性回归模型可以表示为$\hat{y} = \beta_0 + \beta_1 x_1 + \epsilon$,其中$\epsilon \sim N(0, \sigma^2)$。 ``` 渲染效果: 线性回归模型可以表示为$\hat{y} = \beta_0 + \beta_1 x_1 + \epsilon$,其中$\epsilon \sim N(0, \sigma^2)$。 2. 独立公式正确写法(用`$$...$$`单独成段): ```rmarkdown 概率密度函数公式: $$f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{ -\frac{(x-\mu)^2}{2\sigma^2} }$$ 这是正态分布的核心表达式。 ``` 渲染效果: 概率密度函数公式: $$f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{ -\frac{(x-\mu)^2}{2\sigma^2} }$$ 这是正态分布的核心表达式。 3. 常见错误示例及修正: ```rmarkdown # 错误1:忘记加$符号 矩阵乘法应写作 AB ≠ BA → 修正为:$AB \neq BA$ # 错误2:独立公式未换行 错误写法:方差公式$$s^2 = \frac{1}{n-1}\sum_{i=1}^n (x_i - \bar{x})^2$$需要单独展示 正确写法: 方差公式 $$s^2 = \frac{1}{n-1}\sum_{i=1}^n (x_i - \bar{x})^2$$ 需要单独展示 # 错误3:符号未转义 错误:α粒子 → 正确:$\alpha$粒子 ``` 4. 完整R Markdown文档结构示例: ```rmarkdown --- title: "数学公式演示" output: pdf_document --- ## 假设检验 原假设可表示为$H_0: \mu = \mu_0$,检验统计量: $$Z = \frac{\bar{X} - \mu_0}{\sigma/\sqrt{n}}$$ ## 积分计算 当计算傅里叶系数时: $$\int_{-\pi}^{\pi} \cos(nx)\sin(mx)dx = 0$$ 这个性质在信号处理中非常重要。 ``` 注意事项: 1. 在RStudio中需使用`.Rmd`文件 2. 通过Knit按钮(或`Ctrl+Shift+K`)编译文档 3. 输出格式支持PDF/HTML/Word,但建议优先使用PDF格式显示数学公式 4. 复杂公式可使用`\begin{align}...\end{align}`等环境(仍需包裹在`$$`中)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值