中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

會(huì)python做網(wǎng)站seo優(yōu)化前景

會(huì)python做網(wǎng)站,seo優(yōu)化前景,陜西專業(yè)網(wǎng)站建設(shè)價(jià)格,wordpress好看的主題為了理解編碼,我們要先區(qū)分 文件中字符編碼 和 程序運(yùn)行時(shí)字符編碼 的區(qū)別。 文件中字符編碼 顧名思義 就是 文字保存在文件中的采用的字符編碼方式,可以在IDE中看到程序運(yùn)行時(shí)字符編碼,是編譯器讀取從源文件中讀取到字符串后再按要求做的一次…

為了理解編碼,我們要先區(qū)分 文件中字符編碼 和 程序運(yùn)行時(shí)字符編碼 的區(qū)別。
文件中字符編碼 顧名思義 就是 文字保存在文件中的采用的字符編碼方式,可以在IDE中看到
程序運(yùn)行時(shí)字符編碼,是編譯器讀取從源文件中讀取到字符串后再按要求做的一次字符編碼轉(zhuǎn)換后存入所采用的字符編碼,這個(gè)字符編碼轉(zhuǎn)碼過程是編譯器編譯時(shí)發(fā)生的,經(jīng)過編譯器生成的obj文件和exe中保存的字符串就是采用編碼轉(zhuǎn)換后的字符編碼,也是運(yùn)行時(shí)的字符編碼,這個(gè)編碼可能與源文件中不是同一種字符編碼。
通過編譯器參數(shù)finput-charset(gcc編譯器)/source-charset(vs編譯器)設(shè)置輸入到編譯器的源文件的字符編碼,通過便器參數(shù)fexec-charset(gcc編譯器)/execution-charset(vs編譯器)設(shè)置目標(biāo)文件中字符編碼。
編譯出來的程序 進(jìn)行 文件讀寫 操作時(shí) 需要做額外操作, 特別是讀取文件字節(jié)流 放入到QString中 時(shí),需要明確知道文件中的字符編碼,然后給與正確的轉(zhuǎn)換。

文件編碼和輸出顯示亂碼有興趣可以參考:qt 漢字輸出 顯示亂碼 解決-CSDN博客


QString中只存放unicode的utf16編碼的字符串,內(nèi)部用QChar(short)類型的內(nèi)存 進(jìn)行 保存。

char*變量在內(nèi)存中存放的字符串默認(rèn)編碼,與編譯器參數(shù) execution-charset有關(guān),而vs2015及以下編譯器默認(rèn)為 "/execution-charset=GB2312",也就是char*變量?jī)?nèi)存中保存時(shí)使用ansi(具體為GB2312)編碼,vs2022默認(rèn)為 "/execution-charset=UTF-8",gcc或類gcc編譯器默認(rèn)為 "-fexec-charset=UTF-8",特就是char*使用unicode的utf8編碼。可以通過在字符串前加u8強(qiáng)制編譯器對(duì)某個(gè)char*變量在內(nèi)存中保存時(shí)采用unicode的utf8編碼。

char*轉(zhuǎn)換成QString,一定會(huì)做一次字符編碼的轉(zhuǎn)碼!!!
通過QString(const char*)構(gòu)造的QString對(duì)象,char*字符串會(huì)被QString強(qiáng)制當(dāng)成unicode的 utf8編碼,這是QString代碼不可更改的,并隱式的將這個(gè)強(qiáng)制當(dāng)做unicode 的utf8編碼的字符串轉(zhuǎn)換成unicode的utf16編碼的字符串。vs編譯器 的 execution-charset 默認(rèn) 為ansi編碼,存放的編碼為ansi編碼,如果你qt工程采用vs2015編譯器或以下編譯器,這時(shí)候強(qiáng)制當(dāng)做unicode的utf8轉(zhuǎn)換成QString,就一定會(huì)亂碼,(所以這個(gè)時(shí)候最好設(shè)置"/execution-charset=UTF-8"的編譯器參數(shù))。QString 官方不建議使用從char*轉(zhuǎn)QString的構(gòu)造函數(shù)。所以在這個(gè)構(gòu)造函數(shù)前加了QT_ASCII_CAST_WARN 宏開關(guān)和宏提示。
QString中所有的從char*轉(zhuǎn)換到QString的構(gòu)造函數(shù) 或者 由char*隱式轉(zhuǎn)換到QString的函數(shù) 或者 參數(shù)中含有char*的非static函數(shù) 都是隱式調(diào)用QString::fromUtf8(char*) 這個(gè)靜態(tài)函數(shù) 進(jìn)行字符編碼的轉(zhuǎn)換的。
從QByteArray轉(zhuǎn)QString 與 char*轉(zhuǎn)QString 是一樣,也會(huì)出現(xiàn)同樣的問題

D:\Qt\Qt5.12.0\5.12.0\mingw73_64\include\QtCore\qstring.h
#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
.......inline QT_ASCII_CAST_WARN QString(const char *ch): d(fromAscii_helper(ch, ch ? int(strlen(ch)) : -1)){}inline QT_ASCII_CAST_WARN QString(const QByteArray &a): d(fromAscii_helper(a.constData(), qstrnlen(a.constData(), a.size()))){}inline QT_ASCII_CAST_WARN QString &operator=(const char *ch){ return (*this = fromUtf8(ch)); }inline QT_ASCII_CAST_WARN QString &operator=(const QByteArray &a)
......D:\Qt\Qt5.12.0\5.12.0\Src\qtbase\src\corelib\tools\qstring.cpp
......
QString::Data *QString::fromAscii_helper(const char *str, int size)
{QString s = fromUtf8(str, size);s.d->ref.ref();return s.d;
}
......

從char*轉(zhuǎn)到QString ,QString有提供很多的static類型的轉(zhuǎn)碼函數(shù),qt建議通過調(diào)用這些函數(shù)進(jìn)行顯示的編碼轉(zhuǎn)換。

D:\Qt\Qt5.12.0\5.12.0\mingw73_64\include\QtCore\qstring.hstatic inline QString fromLatin1(const QByteArray &str)//從ascii編碼轉(zhuǎn)unicode的utf16編碼{ return str.isNull() ? QString() : fromLatin1(str.data(), qstrnlen(str.constData(), str.size())); }static inline QString fromUtf8(const QByteArray &str)  //從unicode8的編碼轉(zhuǎn)換成unicode的utf16編碼{ return str.isNull() ? QString() : fromUtf8(str.data(), qstrnlen(str.constData(), str.size())); }static inline QString fromLocal8Bit(const QByteArray &str) //從local編碼轉(zhuǎn)換蟲unicode的utf16編碼{ return str.isNull() ? QString() : fromLocal8Bit(str.data(), qstrnlen(str.constData(), str.size())); }static QString fromUtf16(const ushort *, int size = -1);   //從unicode的utf16編碼轉(zhuǎn)unicode的utf16編碼,可以在字符串前存放BOM來指定輸入的字符串字節(jié)序,否則采用系統(tǒng)默認(rèn)字節(jié)序static QString fromUcs4(const uint *, int size = -1);      //從unicode的utf32編碼轉(zhuǎn)unicode的utf16編碼,可以在字符串前存放BOM來指定輸入的字符串字節(jié)序,否則采用系統(tǒng)默認(rèn)字節(jié)序
#if defined(Q_COMPILER_UNICODE_STRINGS)static QString fromUtf16(const char16_t *str, int size = -1){ return fromUtf16(reinterpret_cast<const ushort *>(str), size); }static QString fromUcs4(const char32_t *str, int size = -1){ return fromUcs4(reinterpret_cast<const uint *>(str), size); }
#endif

fromutf16()和fromutf32()都可以在字符串前面加入BOM,來明確告訴QString,字節(jié)流所采用的字節(jié)序(大小端)。否則會(huì)被默認(rèn)當(dāng)做當(dāng)前系統(tǒng)所采用的字節(jié)序。
下面是fromutf16中自動(dòng)識(shí)別輸入的字節(jié)流中的BOM,并將輸入字節(jié)流轉(zhuǎn)換成本地字節(jié)序的unicode的utf16編碼的過程。

D:\Qt\Qt5.12.0\5.12.0\Src\qtbase\src\corelib\tools\qstring.cpp
.......
QString QString::fromUtf16(const ushort *unicode, int size)
{if (!unicode)return QString();if (size < 0) {size = 0;while (unicode[size] != 0)++size;}return QUtf16::convertToUnicode((const char *)unicode, size*2, 0);
}
........D:\Qt\Qt5.12.0\5.12.0\Src\qtbase\src\corelib\codecs\qutfcodec_p.h
.......
enum DataEndianness
{DetectEndianness,BigEndianness,LittleEndianness
};
.......D:\Qt\Qt5.12.0\5.12.0\msvc2015_64\include\QtCore\qchar.h
......
class Q_CORE_EXPORT QChar {
public:enum SpecialCharacter {.......ByteOrderMark = 0xfeff,ByteOrderSwapped = 0xfffe,
........D:\Qt\Qt5.12.0\5.12.0\Src\qtbase\src\corelib\codecs\qutfcodec.cpp    
........
QString QUtf16::convertToUnicode(const char *chars, int len, QTextCodec::ConverterState *state, DataEndianness e = DetectEndianness)
{DataEndianness endian = e;bool half = false;uchar buf = 0;bool headerdone = false;QChar *qch = (QChar *)result.data();
......while (len--) {if (half) {QChar ch;if (endian == LittleEndianness) {ch.setRow(*chars++);ch.setCell(buf);} else {ch.setRow(buf);ch.setCell(*chars++);}if (!headerdone) {headerdone = true;if (endian == DetectEndianness) {if (ch == QChar::ByteOrderSwapped) {endian = LittleEndianness;} else if (ch == QChar::ByteOrderMark) {endian = BigEndianness;} else {if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {endian = BigEndianness;} else {endian = LittleEndianness;ch = QChar((ch.unicode() >> 8) | ((ch.unicode() & 0xff) << 8));}*qch++ = ch;}} else if (ch != QChar::ByteOrderMark) {*qch++ = ch;}} else {*qch++ = ch;}half = false;} else {buf = *chars++;half = true;}}
......

QTextCodec主要意義之一就是為QString的toLocal8BIt()和fromLocal8Bit(char*)設(shè)置字符編碼器。QTextCodec可以通過預(yù)編譯宏開關(guān)QT_NO_TEXTCODEC 進(jìn)行開啟或關(guān)閉,默認(rèn)開啟。

fromLocal8Bit(char*)需要與QTextCodec結(jié)合使用,否則輸入的字節(jié)流會(huì)被當(dāng)做ascii編碼進(jìn)行處理。fromLocal8Bit(char*)需要通過QTextCodec為QString指定字符編碼器,而該字符編碼要與編譯器所采用的編碼保持一致,也就是編譯器參數(shù) execution-charset(vs編譯器參數(shù)) /fexec-charset(gcc編譯器)所指定的編碼保持一致!!!

QString QString::fromLocal8Bit_helper(const char *str, int size)
{if (!str)return QString();if (size == 0 || (!*str && size < 0)) {QStringDataPtr empty = { Data::allocate(0) };return QString(empty);}
#if !defined(QT_NO_TEXTCODEC)if (size < 0)size = qstrlen(str);QTextCodec *codec = QTextCodec::codecForLocale();  //獲取到TextCodec設(shè)置的字符編碼器if (codec)return codec->toUnicode(str, size);
#endif // !QT_NO_TEXTCODECreturn fromLatin1(str, size);
}

同樣的QString 的 toLocal8BIt()?也依賴QTextCodec,qt輸出到控制臺(tái)窗口時(shí),會(huì)使用QTextCodec進(jìn)行字符轉(zhuǎn)碼,然后再輸出到控制臺(tái)窗口。具體參考qt 漢字輸出 顯示亂碼 解決-CSDN博客

?簡(jiǎn)單案例:

#include <QTextCodec>
#include <QDebug>
#include <Windows.h>
int main()
{//QTextCodec編碼器要與編譯器參數(shù)execution-charset(vs編譯器,默認(rèn)為GB2312)/fexec-charset(gcc或類gcc編譯器,默認(rèn)為UTF8)的值一致,QTextCodec *codec=QTextCodec::codecForName("GB2312");   //設(shè)置QString的fromLocal8Bit() 和toLocal8Bit()的QTextCodec為GB2312QTextCodec//QTextCodec *codec=QTextCodec::codecForName("UTF-8");  //設(shè)置QString的fromLocal8Bit() 和toLocal8Bit()的QTextCodec為UTF-8 QTextCodecQTextCodec::setCodecForLocale(codec);QString s=QString::fromLocal8Bit("你好");//QString s=QString::fromUtf8(u8"你好");  //system("chcp 936");      //設(shè)置控制臺(tái)輸出窗口接收GB2312編碼的字符串//system("chcp 65001");  //設(shè)置控制臺(tái)輸出窗口接收utf8編碼的字符串qDebug()<<s<<endl;return 0;
}

http://www.risenshineclean.com/news/35498.html

相關(guān)文章:

  • 天長(zhǎng)企業(yè)網(wǎng)站制作最近的新聞?wù)?/a>
  • 做賭石網(wǎng)站客服的經(jīng)驗(yàn)電子商務(wù)seo實(shí)訓(xùn)總結(jié)
  • 網(wǎng)站做短信接口具體方法正規(guī)的關(guān)鍵詞優(yōu)化軟件
  • 多用戶智能網(wǎng)站建設(shè)源碼洛陽網(wǎng)站seo
  • 聊城開發(fā)區(qū)建設(shè)局網(wǎng)站湖南專業(yè)關(guān)鍵詞優(yōu)化服務(wù)水平
  • 公務(wù)員 做網(wǎng)站 違法網(wǎng)站制作網(wǎng)站推廣
  • 手機(jī)網(wǎng)站改版公司百度關(guān)鍵詞熱度查詢工具
  • 做電影網(wǎng)站模板教學(xué)網(wǎng)站制作設(shè)計(jì)
  • 專做醫(yī)藥中間體的網(wǎng)站今天微博熱搜前十名
  • 幫一個(gè)企業(yè)做網(wǎng)站流程seo線上培訓(xùn)班
  • 效果圖在線制作重慶seo俱樂部
  • Iis 建網(wǎng)站為什么說沒有該用戶seo推廣顧問
  • 做電玩城設(shè)計(jì)的網(wǎng)站關(guān)鍵詞優(yōu)化公司
  • 如何搭建一個(gè)視頻網(wǎng)站互聯(lián)網(wǎng)營(yíng)銷專業(yè)
  • 如何在公司網(wǎng)站上添加內(nèi)容微信朋友圈產(chǎn)品推廣語
  • 服裝網(wǎng)站建設(shè)與實(shí)現(xiàn)西安seo顧問公司
  • 電商網(wǎng)站開發(fā)平臺(tái)實(shí)驗(yàn)河南搜索引擎優(yōu)化
  • 百度優(yōu)化網(wǎng)站建設(shè)網(wǎng)站制作多少錢
  • 村網(wǎng)站建設(shè)計(jì)劃書深圳專業(yè)建站公司
  • 網(wǎng)站開發(fā)需要幾個(gè)人企業(yè)網(wǎng)址怎么注冊(cè)
  • 河北建設(shè)廳注冊(cè)中心網(wǎng)站長(zhǎng)沙做優(yōu)化的公司
  • 做網(wǎng)站順序搜索引擎優(yōu)化排名seo
  • 南京網(wǎng)站的優(yōu)化石景山區(qū)百科seo
  • wordpress七牛加密怎樣優(yōu)化網(wǎng)站排名靠前
  • 電子商務(wù)網(wǎng)站建設(shè)的核心是長(zhǎng)沙做網(wǎng)絡(luò)推廣公司的
  • 自建網(wǎng)站如何上傳視頻市場(chǎng)營(yíng)銷策劃書
  • wordpress php學(xué)習(xí)廣州網(wǎng)站快速排名優(yōu)化
  • 網(wǎng)站建設(shè)策劃書競(jìng)價(jià)網(wǎng)絡(luò)推廣
  • 網(wǎng)站用途說明全國(guó)疫情實(shí)時(shí)動(dòng)態(tài)
  • 汕頭網(wǎng)站建設(shè)系統(tǒng)學(xué)校網(wǎng)站建設(shè)