精华内容
下载资源
问答
  • 主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。 关系型数据库是数据库的数据之间存在关联关系,关系型数据库可以通过一条数据关联出一些列数据,方便了...

    1.MySQL知识普及:
    MySQL是一个开放源代码的关系数据库管理系统。
    MySQL架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。
    关系型数据库是数据库的数据之间存在关联关系,关系型数据库可以通过一条数据关联出一些列数据,方便了数据的检索和查询,提高开发人员的查询效率,但是会拖累数据库,因此关系型数据库不支持太高的并发
    MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。MySQL使用 C和 C++编写,其体积小、速度快、源码开放,如今被应用在大量的中小型应用上
    ————————————————
    Mysql储存过程简介
    储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL 语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存 储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。
    Mysql数据库存储的优点
    1、存储过程能实现较快的执行速度。
    如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
    2、存储过程允许标准组件是编程。
    存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
    3、存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
    4、存储过程可被作为一种安全机制来充分利用。
    系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
    5、存储过程能过减少网络流量。
    针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

    MySQL数据传输原理编码原理
    一、基本概念
    1、 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A’赋予数值0,给字符’B’赋予数值1,则0就是字符’A’的编码;
    2、 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{‘A’,'B’}时,{‘A’=>0, ‘B’=>1}就是一个字符集;
    3、字符序(Collation)是指在同一字符集内字符之间的比较规则;
    4、确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;
    5、每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation);
    6、MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;
    二、名词解释
    1、character_set_client:客户端数据解析、编码的字符集。
    2、character_set_connection:连接层字符集。
    3、character_set_server:服务器内部操作字符集。
    4、character_set_results:查询结果字符集。
    5、character_set_database:当前数据库的字符集。
    6、character_set_system:系统源数据(字段名等)字符集。
    注:
    1、还有以collation_开头的同上面对应的变量,用来描述字符序。
    2、服务端编码、解析时,是按照前一环节的编码进行解析的,按照各自的字符集进行编码的。
    3、character_set_server是mysql数据库内存的操作字符集。如果创建数据库时,没有指定数据库的字符集,则使用character_set_server的字符集作为默认字符集;如果创建表时,没有指定表的字符集,则使用character_set_database的字符集作为默认字符集;如果在创建字段时,没有指定字段的字符集,则使用表的字符集作为默认字符集。
    4、set names gbk;等同于同时设置character_set_client,character_set_connection,character_set_results这三个字符集
    三、数据传输过程中字符集编码、解析
    1.客户端以及编码
            我们使用jdbc操作数据的程序、navicate操作工具、操作系统操作数据库这些都认为是客户端。客户端navicate的编码为utf8,windows默认的编码为gbk。一般情况下,utf8编码的中文占三个字节,gbk占用两个字节(一个字节是8位二进制,也就是两个十六进制)。
    2.解析过程
    a.sql语句通过客户端编码发送到mysql服务器上;
    b.character_set_client对接收到的数据进行解码,这里解码按照character_set_client编码进行解码,最后按照自身字符集进行编码。
    c.character_set_connection收到来自client的编码,这里进行字符集转换。注意这里s.decode(character_set_client).encode(character_set_connection)。
    d.character_set_server这里是服务器内部使用的字符集,如果单独给字段添加字符集,这里取的是字段字符集。这里收到connection的编码,进行字符集转换。e.decode(character_set_connection).encode(character_set_server)。
    3.查询过程
    a.mysql服务器转换为character_set_results发送到客户端,其实这里你只要知道最后从服务器出来的时候是按照character_set_results编码的。
    b.发送到客户端之后,按照客户端编码进行解码。所以如果character_set_results和客户端编码不一致,会导致查询乱码。

    SQL 语句执行过程
    数据库通常不会被直接使用,而是由其他编程语言通过SQL语句调用mysql,由mysql处理并返回执行结果。那么Mysql接受到SQL语句后,又是如何处理的呢?
    首先程序的请求会通过mysql的connectors与其进行交互,请求到处后,会暂时存放在连接池(connection pool)中并由处理器(Management Serveices & Utilities)管理。当该请求从等待队列进入到处理队列,管理器会将该请求丢给SQL接口(SQL Interface)。SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的结果进行对比,如果完全匹配则通过缓存直接返回处理结果;否则,需要完整的走一趟流程:
    (1)由SQL接口丢给后面的解释器(Parser),上面已经说到,解释器会判断SQL语句正确与否,若正确则将其转化为数据结构。
    (2)解释器处理完,便来到后面的优化器(Optimizer),它会产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果。
    (3)确定最优执行计划后,SQL语句此时便可以交由存储引擎(Engine)处理,存储引擎将会到后端的存储设备中取得相应的数据,并原路返回给程序

    参考资料
    https://blog.csdn.net/m0_38075425/article/details/82256315
    https://www.cnblogs.com/jave1ove/p/7454966.html

    https://www.boxuegu.com/news/443.html

    https://blog.csdn.net/qq_42467347/article/details/82261017

    展开全文
  • JSPServlet对中文处理

    千次阅读 2016-07-04 11:05:20
    JSPServlet对中文处理  世界上的各地区都有本地的语言。地区差异直接导致了语言环境的差异。在开发一个国际化程序的过程中,处理语言问题就显得很重要了。  这是一个世界范围内都存在的问题...

    JSP和Servlet对中文的处理


      世界上的各地区都有本地的语言。地区差异直接导致了语言环境的差异。在开发一个国际化程序的过程中,处理语言问题就显得很重要了。

      这是一个世界范围内都存在的问题,所以,Java提供了世界性的解决方法。本文描述的方法是用于处理中文的,但是,推而广之,对于处理世界上其它国家和地区的语言同样适用。

      汉字是双字节的。所谓双字节是指一个双字要占用两个BYTE的位置(即16位),分别称为高位和低位。中国规定的汉字编码为GB2312,这是强制性的,目前几乎所有的能处理中文的应用程序都支持GB2312。GB2312包括了一二级汉字和9区符号,高位从0xa1到0xfe,低位也是从0xa1到0xfe,其中,汉字的编码范围为0xb0a1到0xf7fe。

      另外有一种编码,叫做GBK,但这是一份规范,不是强制的。GBK提供了20902个汉字,它兼容GB2312,编码范围为0x8140到0xfefe。GBK中的所有字符都可以一一映射到Unicode 2.0。

      在不久的将来,中国会颁布另一种标准:GB18030-2000(GBK2K)。它收录了藏、蒙等少数民族的字型,从根本上解决了字位不足的问题。注意:它不再是定长的。其二字节部份与GBK兼容,四字节部分是扩充的字符、字形。它的首字节和第三字节从0x81到0xfe,二字节和第四字节从0x30到0x39。

      本文不打算介绍Unicode,有兴趣的可以浏览“http://www.unicode.org/”查看更多的信息。Unicode有一个特性:它包括了世界上所有的字符字形。所以,各个地区的语言都可以建立与Unicode的映射关系,而Java正是利用了这一点以达到异种语言之间的转换。

      在JDK中,与中文相关的编码有:

      表1 JDK中与中文相关的编码列表

    编码名称说明
    ASCII7位,与ascii7相同
    ISO8859-18-位,与 8859_1,ISO-8859-1,ISO_8859-1,latin1...等相同
    GB2312-8016位,与gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381, 1383, Cp1383, ISO2022CN,ISO2022CN_GB...等相同
    GBK与MS936相同,注意:区分大小写
    UTF8与UTF-8相同
    GB18030与cp1392、1392相同,目前支持的JDK很少

      在实际编程时,接触得比较多的是GB2312(GBK)和ISO8859-1。

      为什么会有“?”号

      上文说过,异种语言之间的转换是通过Unicode来完成的。假设有两种不同的语言A和B,转换的步骤为:先把A转化为Unicode,再把Unicode转化为B。

      举例说明。有GB2312中有一个汉字“李”,其编码为“C0EE”,欲转化为ISO8859-1编码。步骤为:先把“李”字转化为Unicode,得到“674E”,再把“674E”转化为ISO8859-1字符。当然,这个映射不会成功,因为ISO8859-1中根本就没有与“674E”对应的字符。

      当映射不成功时,问题就发生了!当从某语言向Unicode转化时,如果在某语言中没有该字符,得到的将是Unicode的代码“\uffffd”(“\u”表示是Unicode编码,)。而从Unicode向某语言转化时,如果某语言没有对应的字符,则得到的是“0x3f”(“?”)。这就是“?”的由来。

      例如:把字符流buf =“0x80 0x40 0xb0 0xa1”进行new String(buf, "gb2312")操作,得到的结果是“\ufffd\u554a”,再println出来,得到的结果将是“?啊”,因为“0x80 0x40”是GBK中的字符,在GB2312中没有。

      再如,把字符串String="\u00d6\u00ec\u00e9\u0046\u00bb\u00f9"进行new String (buf.getBytes("GBK"))操作,得到的结果是“3fa8aca8a6463fa8b4”,其中,“\u00d6”在“GBK”中没有对应的字符,得到“3f”,“\u00ec”对应着“a8ac”,“\u00e9”对应着“a8a6”,“0046”对应着“46”(因为这是ASCII字符),“\u00bb”没找到,得到“3f”,最后,“\u00f9”对应着“a8b4”。把这个字符串println一下,得到的结果是“?ìéF?ù”。看到没?这里并不全是问号,因为GBK与Unicode映射的内容中除了汉字外还有字符,本例就是最好的明证。

      所以,在汉字转码时,如果发生错乱,得到的不一定都是问号噢!不过,错了终究是错了,50步和100步并没有质的差别。

      或者会问:如果源字符集中有,而Unicode中没有,结果会如何?回答是不知道。因为我手头没有能做这个测试的源字符集。但有一点是肯定的,那就是源字符集不够规范。在Java中,如果发生这种情况,是会抛出异常的。

      什么是UTF

      UTF,是Unicode Text Format的缩写,意为Unicode文本格式。对于UTF,是这样定义的:

      (1)如果Unicode的16位字符的头9位是0,则用一个字节表示,这个字节的首位是“0”,剩下的7位与原字符中的后7位相同,如“\u0034”(0000 0000 0011 0100),用“34” (0011 0100)表示;(与源Unicode字符是相同的);

      (2)如果Unicode的16位字符的头5位是0,则用2个字节表示,首字节是“110”开头,后面的5位与源字符中除去头5个零后的最高5位相同;第二个字节以“10”开头,后面的6位与源字符中的低6位相同。如“\u025d”(0000 0010 0101 1101),转化后为“c99d”(1100 1001 1001 1101);

      (3)如果不符合上述两个规则,则用三个字节表示。第一个字节以“1110”开头,后四位为源字符的高四位;第二个字节以“10”开头,后六位为源字符中间的六位;第三个字节以“10”开头,后六位为源字符的低六位;如“\u9da7”(1001 1101 1010 0111),转化为“e9b6a7”(1110 1001 1011 0110 1010 0111);

      可以这么描述JAVA程序中Unicode与UTF的关系,虽然不绝对:字符串在内存中运行时,表现为Unicode代码,而当要保存到文件或其它介质中去时,用的是UTF。这个转化过程是由writeUTF和readUTF来完成的。

      好了,基础性的论述差不多了,下面进入正题。

      先把这个问题想成是一个黑匣子。先看黑匣子的一级表示:

    input(charsetA)->process(Unicode)->output(charsetB)

      简单,这就是一个IPO模型,即输入、处理和输出。同样的内容要经过“从charsetA到unicode再到charsetB”的转化。

      再看二级表示:

    SourceFile(jsp,java)->class->output

      在这个图中,可以看出,输入的是jsp和java源文件,在处理过程中,以Class文件为载体,然后输出。再细化到三级表示:

    jsp->temp file->class->browser,os console,db

    app,servlet->class->browser,os console,db

      这个图就更明白了。Jsp文件先生成中间的Java文件,再生成Class。而Servlet和普通App则直接编译生成Class。然后,从Class再输出到浏览器、控制台或数据库等。

      JSP:从源文件到Class的过程

      Jsp的源文件是以“.jsp”结尾的文本文件。在本节中,将阐述JSP文件的解释和编译过程,并跟踪其中的中文变化。

      1、JSP/Servlet引擎提供的JSP转换工具(jspc)搜索JSP文件中用<%@ page contentType ="text/html; charset=<Jsp-charset>"%>中指定的charset。如果在JSP文件中未指定<Jsp-charset>,则取JVM中的默认设置file.encoding,一般情况下,这个值是ISO8859-1;

      2、jspc用相当于“javac –encoding <Jsp-charset>”的命令解释JSP文件中出现的所有字符,包括中文字符和ASCII字符,然后把这些字符转换成Unicode字符,再转化成UTF格式,存为JAVA文件。ASCII码字符转化为Unicode字符时只是简单地在前面加“00”,如“A”,转化为“\u0041”(不需要理由,Unicode的码表就是这么编的)。然后,经过到UTF的转换,又变回“41”了!这也就是可以使用普通文本编辑器查看由JSP生成的JAVA文件的原因;

      3、引擎用相当于“javac –encoding UNICODE”的命令,把JAVA文件编译成CLASS文件;

      先看一下这些过程中中文字符的转换情况。有如下源代码:

    <%@ page contentType="text/html; charset=gb2312"%>
    <html><body>
    <%
     String a="中文";
     out.println(a);
    %>
    </body></html>

      这段代码是在UltraEdit for Windows上编写的。保存后,“中文”两个字的16进制编码为“D6 D0 CE C4”(GB2312编码)。经查表,“中文”两字的Unicode编码为“\u4E2D\u6587”,用 UTF表示就是“E4 B8 AD E6 96 87”。打开引擎生成的由JSP文件转变而成的JAVA文件,发现其中的“中文”两个字确实被“E4 B8 AD E6 96 87”替代了,再查看由JAVA文件编译生成的CLASS文件,发现结果与JAVA文件中的完全一样。

      再看JSP中指定的CharSet为ISO-8859-1的情况。

    <%@ page contentType="text/html; charset=ISO-8859-1"%>
    <html><body>
    <%
     String a="中文";
     out.println(a);
    %>
    </body></html>

      同样,该文件是用UltraEdit编写的,“中文”这两个字也是存为GB2312编码“D6 D0 CE C4”。先模拟一下生成的JAVA文件和CLASS文件的过程:jspc用ISO-8859-1来解释“中文”,并把它映射到Unicode。由于ISO-8859-1是8位的,且是拉丁语系,其映射规则就是在每个字节前加“00”,所以,映射后的Unicode编码应为“\u00D6\u00D0\u00CE\u00C4”,转化成UTF后应该是“C3 96 C3 90 C3 8E C3 84”。好,打开文件看一下,JAVA文件和CLASS文件中,“中文”果然都表示为“C3 96 C3 90 C3 8E C3 84”。

      如果上述代码中不指定<Jsp-charset>,即把第一行写成“<%@ page contentType="text/html" %>”,JSPC会使用file.encoding的设置来解释JSP文件。在RedHat 6.2上,其处理结果与指定为ISO-8859-1是完全相同的。

      到现在为止,已经解释了从JSP文件到CLASS文件的转变过程中中文字符的映射过程。一句话:从“JspCharSet到Unicode再到UTF”。下表总结了这个过程:

      表2 “中文”从JSP到CLASS的转化过程

    Jsp-CharSetJSP文件中JAVA文件中CLASS文件中
    GB2312D6 D0 CE C4(GB2312)从\u4E2D\u6587(Unicode)到E4 B8 AD E6 96 87 (UTF)E4 B8 AD E6 96 87 (UTF)
    ISO-8859-1D6 D0 CE C4
    (GB2312)
    从\u00D6\u00D0\u00CE\u00C4 (Unicode)到C3 96 C3 90 C3 8E C3 84 (UTF)C3 96 C3 90 C3 8E C3 84 (UTF)
    无(默认=file.encoding)同ISO-8859-1同ISO-8859-1同ISO-8859-1

      下节先讨论Servlet从JAVA文件到CLASS文件的转化过程,然后再解释从CLASS文件如何输出到客户端。之所以这样安排,是因为JSP和Servlet在输出时处理方法是一样的。

      Servlet:从源文件到Class的过程

      Servlet源文件是以“.java”结尾的文本文件。本节将讨论Servlet的编译过程并跟踪其中的中文变化。

      用“javac”编译Servlet源文件。javac可以带“-encoding <Compile-charset>”参数,意思是“用< Compile-charset >中指定的编码来解释Serlvet源文件”。

      源文件在编译时,用<Compile-charset>来解释所有字符,包括中文字符和ASCII字符。然后把字符常量转变成Unicode字符,最后,把Unicode转变成UTF。

      在Servlet中,还有一个地方设置输出流的CharSet。通常在输出结果前,调用HttpServletResponse的setContentType方法来达到与在JSP中设置<Jsp-charset>一样的效果,称之为<Servlet-charset>。

      注意,文中一共提到了三个变量:<Jsp-charset>、<Compile-charset>和<Servlet-charset>。其中,JSP文件只与<Jsp-charset>有关,而<Compile-charset>和<Servlet-charset>只与Servlet有关。

      看下例:

    import javax.servlet.*;

    import javax.servlet.http.*;

    class testServlet extends HttpServlet
    {
     public void doGet(HttpServletRequest req,HttpServletResponse resp)
     throws ServletException,java.io.IOException
     {
      resp.setContentType("text/html; charset=GB2312");
      java.io.PrintWriter out=resp.getWriter();
      out.println("<html>");
      out.println("#中文#");
      out.println("</html>");
     }
    }

      该文件也是用UltraEdit for Windows编写的,其中的“中文”两个字保存为“D6 D0 CE C4”(GB2312编码)。

      开始编译。下表是<Compile-charset>不同时,CLASS文件中“中文”两字的十六进制码。在编译过程中,<Servlet-charset>不起任何作用。<Servlet-charset>只对CLASS文件的输出产生影响,实际上是<Servlet-charset>和<Compile-charset>一起,达到与JSP文件中的<Jsp-charset>相同的效果,因为<Jsp-charset>对编译和CLASS文件的输出都会产生影响。

      表3 “中文”从Servlet源文件到Class的转变过程

    Compile-charsetServlet源文件中Class文件中等效的Unicode码
    GB2312D6 D0 CE C4 
    (GB2312)
    E4 B8 AD E6 96 87 (UTF)\u4E2D\u6587 (在Unicode中=“中文”)
    ISO-8859-1D6 D0 CE C4 
    (GB2312)
    C3 96 C3 90 C3 8E C3 84 (UTF)\u00D6 \u00D0 \u00CE \u00C4 (在D6 D0 CE C4前面各加了一个00)
    无(默认)D6 D0 CE C4 (GB2312)同ISO-8859-1同ISO-8859-1

      普通Java程序的编译过程与Servlet完全一样。

      CLASS文件中的中文表示法是不是昭然若揭了?OK,接下来看看CLASS又是怎样输出中文的呢?

      Class:输出字符串

      上文说过,字符串在内存中表现为Unicode编码。至于这种Unicode编码表示了什么,那要看它是从哪种字符集映射过来的,也就是说要看它的祖先。这好比在托运行李时,外观都是纸箱子,里面装了什么就要看寄邮件的人实际邮了什么东西。

      看看上面的例子,如果给一串Unicode编码“00D6 00D0 00CE 00C4”,如果不作转换,直接用Unicode码表来对照它时,是四个字符(而且是特殊字符);假如把它与“ISO8859-1”进行映射,则直接去掉前面的“00”即可得到“D6 D0 CE C4”,这是ASCII码表中的四个字符;而假如把它当作GB2312来进行映射,得到的结果很可能是一大堆乱码,因为在GB2312中有可能没有(也有可能有)字符与00D6等字符对应(如果对应不上,将得到0x3f,也就是问号,如果对应上了,由于00D6等字符太靠前,估计也是一些特殊符号,真正的汉字在Unicode中的编码从4E00开始)。

      各位看到了,同样的Unicode字符,可以解释成不同的样子。当然,这其中有一种是我们期望的结果。以上例而论,“D6 D0 CE C4”应该是我们所想要的,当把“D6 D0 CE C4”输出到IE中时,用“简体中文”方式查看,就能看到清楚的“中文”两个字了。(当然了,如果你一定要用“西欧字符”来看,那也没办法,你将得不到任何有何时何地的东西)为什么呢?因为“00D6 00D0 00CE 00C4”本来就是由ISO8859-1转化过去的。
      给出如下结论:

      在Class输出字符串前,会将Unicode的字符串按照某一种内码重新生成字节流,然后把字节流输入,相当于进行了一步“String.getBytes(???)”操作。???代表某一种字符集。

      如果是Servlet,那么,这种内码就是在HttpServletResponse.setContentType()方法中指定的内码,也就是上文定义的<Servlet-charset>。

      如果是JSP,那么,这种内码就是在<%@ page contentType=""%>中指定的内码,也就是上文定义的<Jsp-charset>。

      如果是Java程序,那么,这种内码就是file.encoding中指定的内码,默认为ISO8859-1。

      当输出对象是浏览器时

      以流行的浏览器IE为例。IE支持多种内码。假如IE接收到了一个字节流“D6 D0 CE C4”,你可以尝试用各种内码去查看。你会发现用“简体中文”时能得到正确的结果。因为“D6 D0 CE C4”本来就是简体中文中“中文”两个字的编码。

      OK,完整地看一遍。

      JSP:源文件为GB2312格式的文本文件,且JSP源文件中有“中文”这两个汉字

      如果指定了<Jsp-charset>为GB2312,转化过程如下表。

      表4 Jsp-charset = GB2312时的变化过程

    序号步骤说明结果
    1编写JSP源文件,且存为GB2312格式D6 D0 CE C4
    (D6D0=中 CEC4=文)
    2jspc把JSP源文件转化为临时JAVA文件,并把字符串按照GB2312映射到Unicode,并用UTF格式写入JAVA文件中E4 B8 AD E6 96 87
    3把临时JAVA文件编译成CLASS文件E4 B8 AD E6 96 87
    4运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码4E 2D 65 87(在Unicode中4E2D=中 6587=文)
    5根据Jsp-charset=GB2312把Unicode转化为字节流D6 D0 CE C4
    6把字节流输出到IE中,并设置IE的编码为GB2312(作者按:这个信息隐藏在HTTP头中)D6 D0 CE C4
    7IE用“简体中文”查看结果“中文”(正确显示)

      如果指定了<Jsp-charset>为ISO8859-1,转化过程如下表。

      表5 Jsp-charset = ISO8859-1时的变化过程

    序号步骤说明结果
    1编写JSP源文件,且存为GB2312格式D6 D0 CE C4
    (D6D0=中 CEC4=文)
    2jspc把JSP源文件转化为临时JAVA文件,并把字符串按照ISO8859-1映射到Unicode,并用UTF格式写入JAVA文件中C3 96 C3 90 C3 8E C3 84
    3把临时JAVA文件编译成CLASS文件C3 96 C3 90 C3 8E C3 84
    4运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码00 D6 00 D0 00 CE 00 C4
    (啥都不是!!!)
    5根据Jsp-charset=ISO8859-1把Unicode转化为字节流D6 D0 CE C4
    6把字节流输出到IE中,并设置IE的编码为ISO8859-1(作者按:这个信息隐藏在HTTP头中)D6 D0 CE C4
    7IE用“西欧字符”查看结果乱码,其实是四个ASCII字符,但由于大于128,所以显示出来的怪模怪样
    8改变IE的页面编码为“简体中文”“中文”(正确显示)

      奇怪了!为什么把<Jsp-charset>设成GB2312和ISO8859-1是一个样的,都能正确显示?因为表4表5中的第2步和第5步互逆,是相互“抵消”的。只不过当指定为ISO8859-1时,要增加第8步操作,殊为不便。

      再看看不指定<Jsp-charset> 时的情况。

      表6 未指定Jsp-charset 时的变化过程

    序号步骤说明结果
    1编写JSP源文件,且存为GB2312格式D6 D0 CE C4
    (D6D0=中 CEC4=文)
    2jspc把JSP源文件转化为临时JAVA文件,并把字符串按照ISO8859-1映射到Unicode,并用UTF格式写入JAVA文件中C3 96 C3 90 C3 8E C3 84
    3把临时JAVA文件编译成CLASS文件C3 96 C3 90 C3 8E C3 84
    4运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码00 D6 00 D0 00 CE 00 C4
    5根据Jsp-charset=ISO8859-1把Unicode转化为字节流D6 D0 CE C4
    6把字节流输出到IE中D6 D0 CE C4
    7IE用发出请求时的页面的编码查看结果视情况而定。如果是简体中文,则能正确显示,否则,需执行表5中的第8步

      Servlet:源文件为JAVA文件,格式是GB2312,源文件中含有“中文”这两个汉字

      如果<Compile-charset>=GB2312,<Servlet-charset>=GB2312

      表7 Compile-charset=Servlet-charset=GB2312 时的变化过程

    序号步骤说明结果
    1编写Servlet源文件,且存为GB2312格式D6 D0 CE C4
    (D6D0=中 CEC4=文)
    2用javac –encoding GB2312把JAVA源文件编译成CLASS文件E4 B8 AD E6 96 87 (UTF)
    3运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码4E 2D 65 87 (Unicode)
    4根据Servlet-charset=GB2312把Unicode转化为字节流D6 D0 CE C4 (GB2312)
    5把字节流输出到IE中并设置IE的编码属性为Servlet-charset=GB2312D6 D0 CE C4 (GB2312)
    6IE用“简体中文”查看结果“中文”(正确显示)

      如果<Compile-charset>=ISO8859-1,<Servlet-charset>=ISO8859-1

      表8 Compile-charset=Servlet-charset=ISO8859-1时的变化过程

    序号步骤说明结果
    1编写Servlet源文件,且存为GB2312格式D6 D0 CE C4
    (D6D0=中 CEC4=文)
    2用javac –encoding ISO8859-1把JAVA源文件编译成CLASS文件C3 96 C3 90 C3 8E C3 84 (UTF)
    3运行时,先从CLASS文件中用readUTF读出字符串,在内存中的是Unicode编码00 D6 00 D0 00 CE 00 C4
    4根据Servlet-charset=ISO8859-1把Unicode转化为字节流D6 D0 CE C4
    5把字节流输出到IE中并设置IE的编码属性为Servlet-charset=ISO8859-1D6 D0 CE C4 (GB2312)
    6IE用“西欧字符”查看结果乱码(原因同表5)
    7改变IE的页面编码为“简体中文”“中文”(正确显示)

      如果不指定Compile-charset或Servlet-charset,其默认值均为ISO8859-1。

      当Compile-charset=Servlet-charset时,第2步和第4步能互逆,“抵消”,显示结果均能正确。读者可试着写一下Compile-charset<>Servlet-charset时的情况,肯定是不正确的。

      当输出对象是数据库时

      输出到数据库时,原理与输出到浏览器也是一样的。本节只是Servlet为例,JSP的情况请读者自行推导。

      假设有一个Servlet,它能接收来自客户端(IE,简体中文)的汉字字符串,然后把它写入到内码为ISO8859-1的数据库中,然后再从数据库中取出这个字符串,显示到客户端。

      表9 输出对象是数据库时的变化过程(1)

    序号步骤说明结果
    1在IE中输入“中文”D6 D0 CE C4IE
    2IE把字符串转变成UTF,并送入传输流中E4 B8 AD E6 96 87
    3Servlet接收到输入流,用readUTF读取4E 2D 65 87(unicode)Servlet
    4编程者在Servlet中必须把字符串根据GB2312还原为字节流D6 D0 CE C4
    5编程者根据数据库内码ISO8859-1生成新的字符串00 D6 00 D0 00 CE 00 C4
    6把新生成的字符串提交给JDBC00 D6 00 D0 00 CE 00 C4
    7JDBC检测到数据库内码为ISO8859-100 D6 00 D0 00 CE 00 C4JDBC
    8JDBC把接收到的字符串按照ISO8859-1生成字节流D6 D0 CE C4
    9JDBC把字节流写入数据库中D6 D0 CE C4
    10完成数据存储工作D6 D0 CE C4 数据库
    以下是从数据库中取出数的过程
    11JDBC从数据库中取出字节流D6 D0 CE C4JDBC
    12JDBC按照数据库的字符集ISO8859-1生成字符串,并提交给Servlet00 D6 00 D0 00 CE 00 C4 (Unicode) 
    13Servlet获得字符串00 D6 00 D0 00 CE 00 C4 (Unicode)Servlet
    14编程者必须根据数据库的内码ISO8859-1还原成原始字节流D6 D0 CE C4 
    15编程者必须根据客户端字符集GB2312生成新的字符串4E 2D 65 87
    (Unicode)
     
    Servlet准备把字符串输出到客户端
    16Servlet根据<Servlet-charset>生成字节流D6D0 CE C4Servlet
    17Servlet把字节流输出到IE中,如果已指定<Servlet-charset>,还会设置IE的编码为<Servlet-charset>D6 D0 CE C4
    18IE根据指定的编码或默认编码查看结果“中文”(正确显示)IE

      解释一下,表中第4第5步和第15第16步是用红色标记的,表示要由编码者来作转换。第4、5两步其实就是一句话:“new String(source.getBytes("GB2312"), "ISO8859-1")”。第15、16两步也是一句话:“new String(source.getBytes("ISO8859-1"), "GB2312")”。亲爱的读者,你在这样编写代码时是否意识到了其中的每一个细节呢?

      至于客户端内码和数据库内码为其它值时的流程,和输出对象是系统控制台时的流程,请读者自己想吧。明白了上述流程的原理,相信你可以轻松地写出来。

      行文至此,已可告一段落了。终点又回到了起点,对于编程者而言,几乎是什么影响都没有。

      因为我们早就被告之要这么做了。

      以下给出一个结论,作为结尾。

      1、 在Jsp文件中,要指定contentType,其中,charset的值要与客户端浏览器所用的字符集一样;对于其中的字符串常量,不需做任何内码转换;对于字符串变量,要求能根据ContentType中指定的字符集还原成客户端能识别的字节流,简单地说,就是“字符串变量是基于<Jsp-charset>字符集的”;

      2、 在Servlet中,必须用HttpServletResponse.setContentType()设置charset,且设置成与客户端内码一致;对于其中的字符串常量,需要在Javac编译时指定encoding,这个encoding必须与编写源文件的平台的字符集一样,一般说来都是GB2312或GBK;对于字符串变量,与JSP一样,必须“是基于<Servlet-charset>字符集的”。
    展开全文
  • 最重要的是,计算机存储单位我们通常习惯以字节(Byte)来计算,而网络传输中,运营商等的几M宽带习惯以位(bit)来计算。 计算机存储单位 计算机中最小的存储单元是位(bit)也有记为B的,为了避免混淆,我一律记...

    最近在算报文传输的各种速率的时候,被各种单位搞得比较混乱。这里重新梳理一下。最重要的是,计算机存储单位我们通常习惯以字节(Byte)来计算,而网络传输中,运营商等的几M宽带习惯以位(bit)来计算

    计算机存储单位

    计算机中最小的存储单元是位(bit)也有记为B的,为了避免混淆,我一律记为bit。

    而最常用的,也是我们最习惯的存储单位是字节(Byte),1Byte=8bit

    为什么说我们最习惯的是字节而不是位呢,应为我们日常用的KB,MB,GB中大写的B都是Byte。其中关系为

    1KB = 2^10Byte

    1MB = 2^20Byte

    1GB = 2^30Byte

    这也是我不把bit记为B的原因,因为往往我们看到的大写的B都是Byte,而小写的b是bit。

    网络中的传输单位

    网络中的传输单位则通常习惯是以位来表示的,1M的宽带实际上是1Mb的宽带,通常会写为1Mbps,表示1Mbit/s。这个速度换算成我们认知的下载速度(我们还是习惯以计算机存储单位来计算)实际上就是1/8MByte/s = 0.125MB/s。

    计算报文发出时间也是一样的,一封报文通过百兆口(100Mbit/s)发出的时间及为报文长度(Byte)/(8*100M)

    题外话

    对于计算机存储,除了上面的内容外,通常还会纠结关于“字符”这个单位。字其实不是计算机存储的单位,而是不同语言表现出来的单位。即对于英文来说,一个英文字母就是一个字符,对于中文来说,一个汉字就是一个字符。而一个字符可以换算成多少个字节,则取决于编码。这也很好理解,编码就是把不同的人类字符转化成计算机能识别的字节或位的。对于ASCII码,一个英文字母占一个字节,一个汉字占两个字节。对于UTF-8,一个英文字母占一个字节,一个汉字占三个字节。

    展开全文
  • DICOM是Digital Imaging and Communications in Medicine的英文缩写,即医学数字成像通信标准
  • 大端小端传输字节序

    千次阅读 2020-08-18 14:23:03
    大端小端 在计算机中是以字节为单位,每一个地址对应一个字节,一个字节8bit。在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过sizeof来获取不同类型在内存...

    大端和小端

    在计算机中是以字节为单位,每一个地址对应一个字节,一个字节8bit。在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过sizeof来获取不同类型在内存中占用的字节数。在计算机系统中,当物理单位的长度大于1个字节时,就要区分字节顺序。常见的字节顺序有两种:Big Endian(High-byte first) 和 Litter Endian(Low-byte first),当然还有其他字节顺序,但不常见,例如Middle Endian。

    一、最高有效位、最低有效位

    要理解Big Endian和Little Endian,首先要搞清楚MSB和LSB。
    1.MSB(Most significant Bit)最高有效位

    在一个n位二进制数字中n-1位,也就是最左边的位。

    2.LSB(Least Significant Bit)最低有效位

    指最右边的位。

    例如:一个int类型的整形123456789
    二进制表达方式: 0000 0111 0101 1011 1100 1101 0001 0101(从右向左,每4bit对齐,最左边(高位)不够用0补齐)
    十六进制表达方式:0 7 5 B C D 1 5

    按照上述关于MSB和LSB的意思,在二进制表达方式中,bit从0开始,从右向左,bit 0位最低有效位,而bit 23为最高有效位。而我们一般称左边的0x07为高位字节,0x15为低位字节。
    再通俗一点解释就是:8421的,8这端为高位,1这端为低位,相应的字节则分别称为高位字节和低位字节。

    二、内存地址

    在内存中,多字节对象都是被存储为连续的字节序列。例如在C语言中,一个类型为int的变量n,如果其存储的首个字节的地址为0x1000,那么剩余3个字节地址将存储在0x1001~0x1003。总之,不管具体字节顺序是以什么方式排列,内存地址的分配一般是从小到大的增长。 我们常把0x1000称为低地址端,把0x1003称为高地址端。

    三、大端和小端

    搞清楚MSB、LSB、高位字节、低位字节之后,再理解大端和小端,就相当容易了,先看看概念:

    小端Little Endian:低字节存放在低地址,低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
    大端Big Endian:高字节存放在低地址,即高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

    以二节中的例子int类型整数123456789位例:

    小端在内存中排列: 0x15 0xCD 0x5B 0x07(低位在前)
    大端在内存中排列: 0x07 0x5B 0xCD 0x15(高位在前)

    从例子中可以看出小端比较符合人的思维,而大端则看上去非常直观。
    注:
    1.例子中是假设编译器支持int为32位的前提下,如果是16位,那大端的排列则为0xCD 0x15 0x07 0x5B
    2.大小端一般是由CPU架构决定,常见的Intel、AMD的CPU使用的是小端字节,而PowerPC使用的是大端字节序,有些ARM处理器还可以选择大端还是小端模式,具体自行查阅。
    3.C#中,字节序跟编译平台所在的CPU相关,例如在Intel x86 CPU架构的windows平台中,C#采用的小端序。而Java由于JVM屏蔽不了不同CPU架构导致额字节序差异,所以默认采用大端字节。所以,大小端模式是由CPU决定,而编译器又可能会改变这种模式。

    在这里插入图片描述

    四、网络字节序和主机字节序

    网络字节序(Network Order):TCP/IP各层协议将字节序定义为Big Endian,因此TCP/IP协议中的字节序同称之为网络字节序。
    主机字节序(Host Order):整数在内存中保存的顺序,它遵循Little Endian规则(不一定,要看主机的CPU架构)。所以当两台主机之间要通过TCP/IP协议进行通信的时候就需要调用相应的函数进行主机序列(Little Endian)和网络序(Big Endian)的转换。

    如果是做跨平台开发时,双方需要协商好字节序,然后根据程序运行的环境,确定是否需要字节序转换。
    例如约定的通讯字节序位是Big Endian,默认的window采用的Little Endian,那收到数据后就需要做转换操作。

    五、C#位操作符

    这里简单记录一下C#位操作符,方便以后自己查阅,也方便理解后面的讲解。

    1. 按位与&
      1&0为0;0&0为0;1&1为1
    2. 按位与|
      1|0为1;0|0为0;1|1为1
    3. 按位取反~
      ~1为0; ~0为1;
    4. 按位异或^
      1^1为0; 0^0为0; 1^0为1;
    5. 左移<<
      位左移运算,将整个数向左移若干位,左移后空出的部分0补齐
    6. 右移>>
      位右移运算,将整个数向右移若干位,右移后空出的部分用0补齐

    六、C#中关于大端和小端的转换

    1.重复轮子

    using System;
    
    namespace Framework.NetPackage.Common
    {
        /// <summary>
        /// 字节序转换辅助类
        /// </summary>
        public static class Endian
        {
            public static short SwapInt16(this short n)
            {
                return (short)(((n & 0xff) << 8) | ((n >> 8) & 0xff));
            }
    
            public static ushort SwapUInt16(this ushort n)
            {
                return (ushort)(((n & 0xff) << 8) | ((n >> 8) & 0xff));
            }
    
            public static int SwapInt32(this int n)
            {
                return (int)(((SwapInt16((short)n) & 0xffff) << 0x10) |
                              (SwapInt16((short)(n >> 0x10)) & 0xffff));
            }
    
            public static uint SwapUInt32(this uint n)
            {
                return (uint)(((SwapUInt16((ushort)n) & 0xffff) << 0x10) |
                               (SwapUInt16((ushort)(n >> 0x10)) & 0xffff));
            }
    
            public static long SwapInt64(this long n)
            {
                return (long)(((SwapInt32((int)n) & 0xffffffffL) << 0x20) |
                               (SwapInt32((int)(n >> 0x20)) & 0xffffffffL));
            }
    
            public static ulong SwapUInt64(this ulong n)
            {
                return (ulong)(((SwapUInt32((uint)n) & 0xffffffffL) << 0x20) |
                                (SwapUInt32((uint)(n >> 0x20)) & 0xffffffffL));
            }
        }
    }
    

    2.BCL库支持的函数
    System.Net.IPaddress.HostToNetworkOrder、System.Net.IPAddress.NetworkToHostOrder,这两个函数的内容实现和上面重复轮子原理一样。

    七、关于负数

    在计算机中,负数以及其绝对值的补码形式表示,不明白可以查阅九中贴出的相关资源。关于负数的字节序跟一般整数的字节序处理没有任何区别。

    八、关于汉字编码以及与字节序的关系

    1.对于gb2312、gbk、gb1&8030、bigs,其编码某个汉字产生的字节顺序,由某编码方案本身决定,不受CPU字节序的影响。其实这几种编码的字节序和大端模式的顺序是一致的。
    在这里插入图片描述
    2.UTF-8
    UTF-8和gb系列编码一样,其编码某个汉字产生的字节顺序,由其编码方案决定,不受CPU字节序的影响。无论一个汉字有多少个字节,它的字节序与编码顺序保持一致。
    在这里插入图片描述
    3、Unicode

    Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。所以他没有要求如何存储编码后的字节,也就受CPU字节序的影响。

    Unicode的具体实现包括UTF-16、UTF-32(当然也包括UTF-8,但由于其编码方式和编码后的字节序与其他Unicode编码实现有较大区别,所以单独拿出来讲解的)。

    4、总结

    1、网络通讯

    在实际的网络通讯中,网络协议例如TCP是规定网络字节序(Network Order)是大端。而针对汉字具体使用什么编码,通讯双方要么提前约定好,要么就需要在数据包中标识好汉字具体使用的编码。

    如果在网络通讯中,涉及例如UTF16这样区分大小端的编码,除非按网络协议要求采用大端模式是,否则也要事先约定好,或者在数据包中标识好使用的字节序模式。

    2、文件

    文件的也会存储汉字,当然也要进行编码。如果采用UTF-16这样的有字节序模式区分的编码,编码规则要求可以在文件头部的BOM(Byte Order Mark)来标记。如果没有标记,除非事先知道字节序的模式,否则只能大小端都试一遍。在这里插入图片描述

    展开全文
  • 但是,其代码优雅性其运行速度不亚于,其他编译语言。 二、PHP数据加密 数据加密的类型有: MD5、sha1、sha256、CRC32多项式冗余校验等。 1. MD5、sha1、sha256 描述:hash加密算法,不可逆。常用于数据验证...
  • Qt实现服务器与客户端传输文字图片(Qt②) 2017-07-12 15:59:53木鱼子酱阅读数 5160更多 分类专栏:qt学习 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接本声明。 本文...
  • 一、选择题1、在微机中,应用最普遍的字符编码是( )A、BCD码 B、ASCII码 C、汉字编码 D、补码2、在计算机网络中,表示数据传输可靠性的指标是A、传输率 B、误码率 C、信息容量 D、频带利用率3、POWERPOINT中,在()...
  • 网络传输中的中文乱码问题

    千次阅读 2017-05-18 23:21:38
    一、解决乱码问题,要先了解一些基础概念: 1、字符集:在计算机底层中数据存储的都是二进制数据,要想获取真正有意义的字符,就必须让二进制数据与每一个字符对应起来,这种对应关系就形成了一张编码表。
  • 计算机中存储、网络传输计量单位

    千次阅读 2019-01-03 13:40:49
    2.网络传输单位 2.1.服务商单位 2.2.软件单位 2.3.解释20M宽带实际下载速度 1.存储单位 1.1.位 英文bit,又称“比特”,计算机中最小的数据存储单位,每个bit存储空间只能存储一个二进制数0或1,即一个bit就是...
  • 文章目录一、串口传输文件...然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件(图片、视频压缩包软件)传输到另外一台电脑,预算文件大小、波特率和传输时间三者之间的关系,并对比实际传输
  • 与将信息隐藏在数字图像中相比,将信息隐藏在数字文本文件中需要较少的存储空间较小的数据传输带宽,具有明显的通用性广泛性。 但是,文本文件的冗余度很低,因此在文本文件中隐藏信息更加困难。 为了克服这个...
  • 系统主要由电压、电流互感器、DSP 电能芯片、信号处理电路、LCD 超大汉字液晶显示器、键盘、声光报警电路、U 盘存储器以及MSP430 MCU的主机电路构成,全自动电力线路参数监控、采集、存储功能进行了研究,实现了长...
  • 如何使用FTP软件进行文件传输( 本地文件传到服务器) 一、FTP是什么? FTP 就是连接「本地」「空间」的传输桥梁,可以从空间服务器中「下载拷贝」文件到本地电脑,或从本地电脑「上传拷贝」文件到空间服务器...
  • c++汉字字符处理

    千次阅读 2016-12-01 00:39:56
    c++汉字字符处理整合
  • 数字图像处理方法的研究源于两个主要的应用领域,其一是为了方便人们分析而图像信息进行改进;其二是为了使机器自动理解而图像数据进行存储传输及显示。
  • 系统主要由电压、电流互感器、DSP 电能芯片、信号处理电路、LCD 超大汉字液晶显示器、键盘、声光报警电路、U 盘存储器以及MSP430 MCU的主机电路构成,全自动电力线路参数监控、采集、存储功能进行了研究,实现了长...
  • 数据的表示和存储 信息的二进制编码 数据:  数值数据:无符号整数、有符号整数;浮点数;(可以在数轴上表示出来,可比较大小的)  非数值数据:逻辑数(包括01序列),字符等   计算机内部所有信息都使用二...
  • 使用httpURLConnection可以在安卓客户端php服务端进行文件传输。当待传输的文件名中包含中文时,会导致上传失败。如待传输的文件名为 "中文.txt" 。 传输失败的原因是由文件名的编码问题造成的。中文一般使用的是...
  •   这里我们是用Xftp进行传输文件到虚拟机,所以乱码原因极可能是Xftp的编码方式虚拟机的编码方式不一致导致的。 ①查看虚拟机编码方式   在命令行输入——echo $LANG,即可查看虚拟机的编码方式。   我这里...
  • bpsk matlab代码冥王星SDR PlutoSDR + MATLAB2019b(Linux版) 介绍: 本项目基于 PlutoSDR ...的其他相关存储库中分叉出来的。 写在最后 其实,Mathworks.corp 也提供了很多参考资料。 例如,MATLAB 有
  • 大家知道,一个含有中文的字符串,比如“中国你好ABC”,在计算机内存储或者传输,最终转换为二进制数据,那么这个中文字符串在QT中,是如何存储传输、并恢复的呢? 首先,为含有中文的字符串指定编码,这里指定...
  • 在计算机中,所有数据都是用01这样的位来描述。一个字节有8位,因此一个字节最多可以描述256个字符。在欧美国家,比如美国,他们的文字字符主要就是26个字母加上一些特殊符号(+-*/等),用一个字节就可以存储,一个...
  • 我们在之前的文章中已经尝试获取s3的所有存储的文件大小 最后修改时间 清洗入库。 现在可以 s3存储进行 精细化的 优化了。比如 s3存储进行分层优化。 这样可以把我们的成本 明显的降低。 s3的存储目前有6层,...
  • 数字图像处理方法的研究源于两个主要应用领域:其一是为了便于人们分析而图像信息进行改进;其二是为例机器自动理解而图像数据进行存储传输及显示。
  • WiFi Storage汉化版更方便你的使用,它的主要功能就是:通过手机的WIFI无线功能,建立WIFI无线局域网,你能够在电脑上手机存储卡主内存和存储卡(就是手机自带存储外加的SD卡)中的文件进行上传下载或者...
  • TCP/IP协议中,FTP标准命令TCP...假设两台计算机通过ftp协议对话,并且能访问Internet, 你可以用ftp命令来传输文件。每种操作系统使用上有某一些细微差别,但是每种协议基本的命令结构是相同的。 FTP的传输有两种方...
  • char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中可以存储汉字啦。...但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的, Unico...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,665
精华内容 41,866
关键字:

对汉字进行传输处理和存储的