键盘乱码怎么恢复,机械键盘乱码怎么恢复

1年前 (2024-04-23)

如何恢复乱码键盘(如何恢复乱码机械键盘)

字符集转换概述

我们需要解释这个特性实际上是人类的概念。计算机可以不关心哪些字符,只关心这个字符对应的字节码。您的计算机如何知道哪些字符集用于一个字节序列?计算机不知道,所以实际上,在计算机中表示一个字符串时,需要包含在同一个字符集中,像这样(作为C语言的例子):

Class { byte * contentcharset _ info * charset}比如我们现在有一个UTF8。字符集编码汉字'我',所以它意味着计算机不仅存储。' I' UTF8编码0xe68891。您还需要存储它是哪个字符集编码信息的信息:

{内容:0xE68891字符集:UTF8}内部电脑包含了一个字库,会设置成另一种字符集,也就是字符的编码可以成功转换成另一种字符集,我们会被调用进行字符集转换。例如,我们可以将上面提到的UTF8字符集转换为GBK字符集编码的形式,并将其转换为:

{ Content:0x ced 2;字符集:GBK;}提示:我们上面的“编码”可以作为动词,也可以理解为名词。当动词表示将字符拍摄成字节序列的过程时,名称作为名称表示字符对应的字符。基于上下文,每个人都知道“编码”的含义。

MySQL客户端和服务器如何通信

发送到服务器的MySQL客户端的响应和发送到客户端的响应实际上是符一定格式的。我们提前调用数据格式的MySQL通信协议,这个协议是开放的。我们可以简单分析一下这个通信协议,简单的拦截软件比如Wireshark。理解了这个通信协议之后,我们甚可以执行自己的客户端软件。市面上有各种各样的MySQL客户端软件,我们不想一一分析。现在我们只选择MySQL安装目录。框自给自足的mysql。编程(这里)mysql。这个程序引用了mysql这个名字。可执行文件),如图所示:

执行我们电脑黑匣子里的可执行文件,相当于启动客户端,就像这样:

提示:这里的“黑匣子”指的是Windows操作系统中的CMD.exe或外壳。

我们通常按照以下步骤使用MySQL:

启动客户端并连接到服务器

客户端发送请求。

服务器接收请求

服务器处理请求

服务器处理请求,为这个客户机生成一个响应

客户收到回应。

我们在分析的每一步都减少了受影响的字符集。

启动客户端并连接到服务器进程。

每个MySQL客户端维护客户端的默认字符集,该字符集基于以下例程:

检测自动操作系统使用的字符集。

MySQL客户端会在启动时检测当前正在使用的操作系统所使用的字符集,并映射出某种规则所支持的一些字符集(通常是操作系统当前使用的字符集,为什么在字符集中会有一些特殊情况,例如如果操作系统当前是ASCII,就会映射到LATIN1字符集)。

当我们使用UNIX操作系统时;

调用操作系统nl_langinfo(Codeset)获取操作系统当前正在使用的字符集的函数,而这个函数的结果取决于LC_ALL中的三个环境变量LC_ALL,然后是lc_ctype,然后是l .优先级比率lc_ctype。为高电平,lc_ctype。优先级比L高。换句话说,如果设置了LC_ALL。是设置lc_ctype还是LLC_ALL。这是准则;如果LC_ALL未设置。所以lc_ctype。它是准确的;如果都不是LC_ALL。也没有设置lc_ctype,只有L才是准确的。例如,我们将放置环境变量。LC_ALL。设置en_cn.utf-8。像这样:

导出lc_all=zh_cn.utf-8

然后我们在黑匣子里启动MySQL客户端,MySQL客户端检测到这个操作系统的使用。格式

8.字符集,并将客户端默认字符设置为UTF8.。当然,如果没有设置这三个环境变量,那么nl_langinfo(Codeset)该函数将返回操作系统的默认字符集,即在我身边。Macos 10.15.3.在操作系统中,默认字符集是:

美国 - ascii.

此时,NESQL客户端的默认字符集将被设置为拉丁语。此外,我们还需要强调当我们使用黑匣子显示字符时,有一个的字符集,例如使用我的Mac。iterm2.作为黑色框架,我们可以打开:项 - >配置文件 - >终端选项卡,您可以看到iterm2.采用UTF8.要显示字符:

我们一般需要将用于黑匣子中使用的编码显示为操作系统当前使用的代码和代码。如果它不一致,我们点击的字符可能不会显示在屏幕上。例如,如果我愿意LC_ALL.属性设置GBK.然后,让我们输入汉字到黑匣子,屏幕不会显示,就像这样(如下图所示,我点击汉字'一世'影响):

当我们使用Windows操作系统时

调用操作系统getconsolecp.获取当前正在由操作系统使用的字符集的功能。在Windows中,CMD.exe使用的字符集将被映射到一个名为代码页的数字(英文名称:代码页面),我们可以单击右键单击cmd.exe.标题栏,然后单击“属性” - >选项,如下所示,当前代码页面值为936,它表示使用GBK字符集的当前CMD.exe:

更容易,我们可以跑CHCP.该令直接查看当前代码页面:

以这种方式,当我们在黑框中启动MySQL客户端时,MySQL客户端会检测到使用此操作系统。GBK.字符集,并将客户端默认字符设置为GBK.。对应于之前提到的UTF8字符集的代码页。65001如果当前代码页的值为65001,则启动MySQL客户端,然后客户端的默认字符集将成为UTF8.。如果MySQL不支持当前正在使用的自动检测到的操作系统,或者如果在某些情况下不允许自动检测,则MySQL使用其自己的内置默认字符集作为客户端默认字符集。此内置默认字符集是mysql 5.7先前的版本是拉丁语,存在mysql 8.0修改以便UTF8MB4.。用过的默认字符集启动参数如果我们开始使用MySQL客户端默认字符集启动参数,然后客户端的默认字符集将不再检测到当前正在由操作系统使用的字符集,但直接使用启动参数。默认字符集指定的值。例如,我们使用以下令启动客户端:

MySQL - 默认字符集= UTF8

然后无论我们使用的操作系统是什么,操作系统当前使用该字符集,我们将所有都使用UTF8作为MySQL客户端的默认字符集。

在确认MySQL客户端的默认字符集之后,客户端将登录请求启动到服务器,发送诸如用户名,密码和客户端的客户端的信息的某些信息,客户端收到后的信息是什么?服务器,客户端即将发送,什么是字符集编码的字符集编码,以及您生成的响应应该在字符集之后编码在什么字符集(实际上,服务器正在理解客户端的默认值) , 它会character_set_client.那character_set_connection.也character_set_result.这些系统变量设置为此值)。

客户发送请求

成功登陆后,我们可以使用键盘键入我们要在黑匣子中输入的MySQL语句。输入后,您可以单击Enter键作为向服务器发送状态的请求,但客户端发送的语句(本质是字符串是什么?字符集是什么?这实际上涉及交互应用程序和操作系统之间,我们的MySQL客户端程序实际上是一个应用程序,它从黑框中读取数据。实际上是调用操作系统提供的读取接口。在不同的操作系统中,呼叫读取界面实际上是不同,我们还讨论了这种情况:

对于UNIX操作系统

当我们使用输入法软件进入黑匣子中的字符时,使用的编码字符集实际上是当前的操作系统集。例如,LC_ALL.环境变量的值是en_cn.utf-8.然后,意味着使用UTF8字符集实际编码黑帧中的字符。稍后MySQL客户端程序将调用由黑盒子的操作系统提供的读取功能(实际上,来自标准输入流的所谓读取数据),数据读取实际上使用UTF8字符集进行编码。字节序列,它稍后将此字节序列作为请求内容发送到服务器。这实际上会产生问题,如果客户端的默认字符集和当前正在使用操作系统,则将产生更令人尴尬的结果。例如,我们携带客户。- default-character-set = gbk启动参数,然后将客户端的默认字符集设置为GBK,如果此时使用操作系统,则字符集是UTF8。例如,我们的陈述包含汉字。'一世'然后,然后客户呼叫读函数读取的字节序列实际上是0xe68891.,这将是0xe68891.将其发送到服务器,服务器相信来自客户端的请求由GBK编码,这将产生问题(当然,这只是乱码问题的前奏,并不意味着乱码,只在一步中乱码乱码仅当客户端应用程序写入由服务器返回的数据到黑匣子时,才会发生客户端应用程序。

适用于Windows操作系统

在Windows操作系统中,来自黑匣子盒的读取数据是Windows提供的Windows。readconsolew.功能。执行此功能后,MySQL客户端获取一个宽字符数组(实际上,一组16位Unicode),那么客户端需要将宽字符数组再??次转换为客户端设置为字节序列的默认字符。然后,然后将单词序列发送到服务器作为请求的内容。这可以在UNIX操作系统中生成,但可以在Windows系统中避免它。例如,我们携带客户。- default-character-set = gbk启动参数,然后将客户端的默认字符集设置为GBK,如果使用采用的字符集是UTF8。例如,我们的陈述包含汉字。'一世'然后,然后客户呼叫readconsolew.该功能首先读取代表一世单词宽度字符数组,然后将其转换为客户端的默认字符集,这是由GBK字符集编码的数据。0xced2.,然后0xced2.发送到服务器。此时,服务器还认为客户端发送的请求用GBK编码,因此它完全正确?服务器接收请求服务器收到的请求本质上是一个字节序列,并且服务器将被视为系统变量。character_set_client.代表性字符集执行编码字节序列。character_set_client.它是一个会话级系统变量,即在每个客户端和服务器建立连接之后,服务器将保持一个单独的character_set_client.变量,每个客户端将使用客户端的默认字符设置到服务器时服务器登录,然后服务器将客户端设置为独占。character_set_client.。我们可以单独修改Set令character_set_client.相应的值是这样的:设置字符_set_client = gbk;

必须意识到是,character_set_client.相应的字符集必须包括请求中的字符,例如我们将放置character_set_client.放ASCII.并在请求中发送一个汉字。'一世'这将发生:

mysql> set character_set_client = ASCII;查询OK,0行受影响(0.00秒)MySQL>显示“字符%”等变量;+ ------------------------------------------- ---------------------------------------------------------------------------------- ------- -------------------------------|变量_Name |价值|+ ------------------------------------------- ---------------------------------------------------------------------------------- ------- -------------------------------| character_set_client | ASCII || character_set_connection | UTF8 || character_set_database |. UTF8 || character_set_filesystem |二进制|| character_set_results | UTF8 || character_set_server | UTF8 || character_set_system | UTF8 || character_sets_dir | /usr/local/cellar/mysql/5.7.21/share/mysql/charsets/ |+ ------------------------------------------- ---------------------------------------------------------------------------------- ------- -------------------------------套装8行(0.00秒)mysql>选择'i';+ --- +| ??? |+ --- +| ??? |+ --- +设置1行,1条警告(0.00秒)mysql> SHOW WARNINGS\G************************** 1.行******************** * ******级别:警告代码:1300Message: Invalid ascii character string: '\xE6\x88\x91'套装1行(0.00秒)

如图所示,最终提示'E6,88,91'不是正确的ASCII字符。

提示:您可以将Character_set_Client设置为Latin1,请参阅警告,为什么?

服务器处理请求服务器在处理请求时将请求中的字符转换为特定字符集,这是一个系统变量。character_set_connection.表示系统变量也是会话级别。登录服务器时,每个客户端都会通知服务器,然后服务器将客户端设置为独占。character_set_connection.。但是,我们可以通过SET令单独更改此项。character_set_connection.系统变量。例如,客户端被发送到服务器以包括字节序列。0xe68891.,然后为客户端进行系统变量的服务器character_set_client.为了UTF8.,然后服务器会知道字节序列实际上代表汉字。'一世'如果服务器是客户的系统变量,则此时character_set_connection.对于GBK,那么需要将字符转换为计算机中的GBK字符集的形式,即0xced2.。

有些学生可能会认为这一步有点像脱掉裤子,但请考虑这个问题声明:

mysql>选择'a'='a';

您是否有此查询语句的返回结果?应该是真的还是假的?事实上,结果是不确定的。这是因为我们不知道将两个字符串的大小与底部比较了什么!我们应该考虑两个方面:

考虑一个:使用什么样的字符集?

考虑2:在识别编码这些字符串的字符集之后,表示每个字符串将映射到字节序列,然后我们如何比较这些字节,它直接比较了它们的二进制大小,或者有其他比较方法吗?例如'一种'和'一种'UTF8字符集下的编码是0x61和0x41,所以'a'='a'它应该直接比较0x61和0x41大小,或者会0x61减去32后,尺寸更重要,这两种比较方法可以是,每种比较方法我们被称为一种类型比较规则(英文名:整理。

mysql.支持几个字符集,我们可以使用显示Charset.Command View,如下图所示(太多,只有少数几个,所谓的自己运行这个令):

mysql> show charset;+ -------- + ------------------------------- ------------- + -------- +| Charset |描述|默认排序规则| maxlen |+ -------- + ------------------------------- ------------- + -------- +| big5 | Big5繁体中文| big5_chinese_ci | 2 ||拉丁文1 | CP1252西欧| latin1_swedish_ci | 1 ||拉丁语2 | ISO 8859-2*欧洲| latin2_general_ci | 1 || ASCII |美国ASCII | ascii_general_ci | 1 |gb2312 | GB2312简体中文| gb2312_chinese_ci | 2 || GBK | GBK简体中文| gbk_chinese_ci | 2 |UTF8 | UTF-8 Unicode | UTF8_GENERAL_CI | 3 |UTF8MB4 | UTF-8 Unicode | UTF8MB4_GENERAL_CI | 4 || UTF16 | UTF-16 Unicode | UTF16_GENERAL_CI | 4 |UTF16LE | UTF-16LE UNIICODE | UTF16LE_GENERAL_CI | 4 || UTF32 | UTF-32 Unicode | UTF32_GENERAL_CI | 4 ||二进制|二进制伪字符集|二进制| 1 |GB18030 |中国国家标准GB18030 | gb18030_chinese_ci | 4 |+ -------- + ------------------------------- ------------- + -------- +套装中的41行(0.04秒)

这些字符集中的每一个对应于多个比较,并且我们使用UTF8字符集作为示例(太多,仅几个):

mysql>显示charset ='utf8'的排序规则;+ --------------------------- + ------ --- + -------- + ------- +|整理| Charset | ID |默认编译| sortlen |+ --------------------------- + ------ --- + -------- + ------- +| UTF8_GENERAL_CI | UTF8 | 33 |是的是的1 || UTF8_BIN | UTF8 | 83 | |是的1 || UTF8_UNICODE_CI | UTF8 | 192 | |是的8 || UTF8_icelandic_ci | UTF8 | 193 | |是的8 |UTF8_LATVIAN_CI | UTF8 | 194 | |是的8 || UTF8_ROMANIAN_CI | UTF8 | 195 | |是的8 |+ --------------------------- + ------ --- + -------- + ------- +套装27行(0.00秒)

在UTF8_GENERAL_CI.它是UTF8字符集的默认比较规则,在此比较规则下是不区分大小写的,但UTF8_BIN.这种比较规则是区分大小写。我们请求转换字节顺序character_set_connection.在相应的字符集编码字节序列之后,也可以支持相应的比较规则,这种比较规则是collat??ion_connection.指定了系统变量。我们现在通过set令修改它。collat??ion_connection.该值设置为UTF8.和UTF8_GENERAL_CI.,然后比较'一种'和'一种':

mysql> set character_set_connection = utf8;查询OK,0行受影响(0.00秒)mysql> set collat??ion_connection = utf8_general_ci;查询OK,0行受影响(0.00秒)mysql>选择'a'='a';+ --------- +| 'a'='a'|+ --------- +| 1 |+ --------- +套装1行(0.00秒)

可以看出,在这种情况下,这两个字符串相等。

我们现在通过set令修改它。collat??ion_connection.该值设置为UTF8.和UTF8_BIN.,然后比较'一种'和'一种':

mysql> set character_set_connection = utf8;查询OK,0行受影响(0.00秒)mysql> set collat??ion_connection = utf8_bin;查询OK,0行受影响(0.00秒)mysql>选择'a'='a';+ --------- +| 'a'='a'|+ --------- +| 0 |+ --------- +套装1行(0.00秒)

可以看出,在这种情况下,这两个字符串不相等。

当然,如果我们不需要单独指定单独使用的字符集和比较规则,请不要太担心。character_set_connection.和collat??ion_connection.将它设置为,但您需要注意它,它是character_set_connection.相应的字符集必须包含请求中的字符。

服务器处理请求为此客户端生成响应

为了成功开发故事,让我们先创建一个表:

创建表T.C varchar(100)发动机= InnoDB Charset = UTF8;

然后将记录插入此表:

插入t值('i');

此表中的数据现在如下:

mysql> select * from t;+ ---- + +| C |+ ---- + +|我|+ ---- + +套装1行(0.00秒)

我们可以看到实际使用表中的字段。UTF8.编码字符集,因此底层存储格式是:0xe68891.阅读后,需要发送给客户端,直接发送给客户端0xe68891.发送给客户?这不一定,这取决于character_set_result.系统变量的值,系统变量也是参数变量。服务器将转换响应character_set_result.由系统变量编码的字符集被发送到客户端。登录服务器时,每个客户端都会通知服务器,然后服务器将客户端设置为独占。character_set_result.。我们还可以使用set令设置character_set_result.价值。还需要注意,character_set_result.相应的字符集应包含响应中的字符。在这里,您将再次强调它。character_set_client.那character_set_connection.和character_set_result.这三个系统变量是服务器的系统变量。每个客户端连接到服务器后,服务器维护此连接的这三个变量,如图所示(我们假设连接1的三个变量是UTF8.这三个变量连接到1GBK.这三个变量连接到1ASCII.,):

一般情况character_set_client.那character_set_connection.和character_set_result.这三个系统变量应与客户端的默认字符集相同,设置名称令可以一次修改这三个系统变量:

mysql> set character_set_client = ASCII;查询OK,0行受影响(0.00秒)MySQL>显示“字符%”等变量;+ ------------------------------------------- ---------------------------------------------------------------------------------- ------- -------------------------------|变量_Name |价值|+ ------------------------------------------- ---------------------------------------------------------------------------------- ------- -------------------------------| character_set_client | ASCII || character_set_connection | UTF8 || character_set_database |. UTF8 || character_set_filesystem |二进制|| character_set_results | UTF8 || character_set_server | UTF8 || character_set_system | UTF8 || character_sets_dir | /usr/local/cellar/mysql/5.7.21/share/mysql/charsets/ |+ ------------------------------------------- ---------------------------------------------------------------------------------- ------- -------------------------------套装8行(0.00秒)mysql>选择'i';+ --- +| ??? |+ --- +| ??? |+ --- +设置1行,1条警告(0.00秒)mysql> SHOW WARNINGS\G************************** 1.行******************** * ******级别:警告代码:1300Message: Invalid ascii character string: '\xE6\x88\x91'套装1行(0.00秒)0

声明和以下三个陈述是等同的:

mysql> set character_set_client = ASCII;查询OK,0行受影响(0.00秒)MySQL>显示“字符%”等变量;+ ------------------------------------------- ---------------------------------------------------------------------------------- ------- -------------------------------|变量_Name |价值|+ ------------------------------------------- ---------------------------------------------------------------------------------- ------- -------------------------------| character_set_client | ASCII || character_set_connection | UTF8 || character_set_database |. UTF8 || character_set_filesystem |二进制|| character_set_results | UTF8 || character_set_server | UTF8 || character_set_system | UTF8 || character_sets_dir | /usr/local/cellar/mysql/5.7.21/share/mysql/charsets/ |+ ------------------------------------------- ---------------------------------------------------------------------------------- ------- -------------------------------套装8行(0.00秒)mysql>选择'i';+ --- +| ??? |+ --- +| ??? |+ --- +设置1行,1条警告(0.00秒)mysql> SHOW WARNINGS\G************************** 1.行******************** * ******级别:警告代码:1300Message: Invalid ascii character string: '\xE6\x88\x91'套装1行(0.00秒)1

但是,您需要特别注意它。设置名称该声明不会更改客户端的默认字符集!

客户收到响应

客户端收到的响应仍然是一个字节序列。客户端如何将此字节序列写入黑匣子,该黑盒子进一步涉及应用程序与操作系统之间的交互。

对于UNIX操作系统,MySQL客户端将数据写入黑匣子盒是操作系统。肉那普京要么FWRITE.功能,这些功能基本上相当于直接用黑匣子写(请注意我们的话:'基本上相当于'事实上,将有一些工作,但我们不想在这里关注这些细节。此时,如果字节序列的字符集与黑匣子显示字符使用的字符集不一致,则所谓的乱码(每个人都会注意到这一次和当前在操作系统中使用的字符集)。例如,我们在启动MySQL客户端时使用它。- default-character-set = gbk启动参数,然后是服务器character_set_result.变量是GBK。然后执行选择*来自t该语句,那么服务器将放置字符'一世'GBK编码,即0xcde2.将其发送到客户端,客户端直接写入黑匣子。如果黑匣子用于显示UTF8字符集显示字符,它将自然地乱码。对于Windows操作系统,MySQL客户端将数据写入黑匣子盒是操作系统。WriteConsolew.一个函数接收一个宽字符数组,因此MySQL客户端调用它以根据客户端默认字符集明确地将其从服务器转换为宽字符集。由于这一步骤,您可以避免上面提到的问题之一。例如,我们在启动MySQL客户端时使用它。- default-character-set = gbk启动参数,然后是服务器character_set_result.变量是GBK。然后执行选择*来自t该语句,那么服务器将放置字符'一世'GBK编码,即0xcde2.将其发送到客户端,客户端将从客户端的默认字符集设置此字节序列,即GBK编码到宽字符数组中,然后调用WriteConsolew.该功能被写入黑匣子,黑匣子可以自然地显示它。如何分析乱码的问题

好的,介绍了每个步骤中涉及的各种字符集。每个人都估计看起来令人眼花缭乱,总结了我们应该如何分析当我们遇到乱码时,而不是胡子眉,随便,一篇文章,然后修改一个参数,运气很好,运气改变。运气不好改变它。我知道我必须知道如何在学习本文后,每个人都必须有节奏来分析乱码的问题:

我使用的操作系统是什么?

对于UNIX系统用户,您必须弄清楚我使用的字符集显示字符使用ITerm2的字符编码属性:我还需要弄清楚操作系统当前使用的字符集,运行locale令。查看:王叫你,请保持在这里> locale

lang =“”

lc_collat??e =“zh_cn.utf-8”

lc_ctype =“zh_cn.utf-8”

lc_messages =“zh_cn.utf-8”

lc_montary =“zh_cn.utf-8”

lc_numeric =“en_cn.utf-8”

lc_time =“en_cn.utf-8”

lc_all =“zh_cn.utf-8”

王叔叔叫你,请保持在这里>没有特殊的极端特殊需求,必须确保上述两个字符集是相同的,否则它甚可以在汉字中输入!对于Windows用户,您使用的黑匣子框的代码页是什么,即操作系统的当前字符集是什么。

客户端的默认字符集是什么?

启动MySQL客户端时是否没有办法?- default字符集参数,如果携带,客户端默认字符集基于此参数指定的值。否则分析当前使用操作系统的字符集。

清楚客户端发送请求时,该字符集编码请求是什么。

对于UNIX系统,我们可以认为该请求由当前的操作系统集编码。

对于Windows系统,我们可以认为该请求由客户端默认字符集编码。

管理人员显示“字符%”等变量令清楚:

character_set_client.:服务器如何认为客户提供请求?character_set_connection.:服务器在运行过程中使用字符集编码请求中的字符character_set_result.:在编码响应后,服务器将使用对客户端的响应的字符集

客户收到响应后:

对于服务器发送的字节序列:

在UNIX操作系统上,可以考虑将字节序列直接写入黑匣子。此时,我们应该弄清楚我们的黑匣子中使用了什么样的字符集显示数据。

在Windows操作系统上,字节序列被认为是由客户端字符集编码的数据,然后转换为宽字符数组以写入黑匣子。

请仔细分析提到的每一步,然后发出:小,它不是乱码,不能统治你!

-结尾-

如果你在这里看到,你喜欢这篇文章,请向前。与此同时,明星(顶部)公共号码可以由博客帖子推。1。在Handherarch谈话后谈论Hashmap和Treemap今天的宁静快速发展3.总结一些关于CPU NGINX的基本知识牛X函数,流量拷贝!

乱码键盘