Java-如何验证泰国字符是否从UTF-8正确编码到TIS620

Java-如何验证泰国字符是否从UTF-8正确编码到TIS620,java,encoding,utf-8,character-encoding,utf-16,Java,Encoding,Utf 8,Character Encoding,Utf 16,获取UTF-8中的输入字符串,我应用了TIS620编码并从中创建了新字符串。现在如何保留字节?因为UTF-8以3字节表示泰国字符,而TIS620以1字节表示。我有一个要求,后端系统只将字符串存储为1字节,所以默认UTF-8会将其中断 如何将字符串编码从UTF-8转换为TIS620 如何在将字节大小传递给后端系统时保留字节大小 如果字符串被重新分配给新字符串,字符编码是保留还是再次转换为UTF-16(Java默认) 在Java中可能吗?任何可以集成的库/实用程序 我尝试了下面的代码,可以检查字节数

获取UTF-8中的输入字符串,我应用了TIS620编码并从中创建了新字符串。现在如何保留字节?因为UTF-8以3字节表示泰国字符,而TIS620以1字节表示。我有一个要求,后端系统只将字符串存储为1字节,所以默认UTF-8会将其中断

  • 如何将字符串编码从UTF-8转换为TIS620
  • 如何在将字节大小传递给后端系统时保留字节大小
  • 如果字符串被重新分配给新字符串,字符编码是保留还是再次转换为UTF-16(Java默认)
  • 在Java中可能吗?任何可以集成的库/实用程序
  • 我尝试了下面的代码,可以检查字节数是否与字符数匹配,即1字节/字符。但是,如果encodedString获得新的字符串分配,它会丢失TIS620格式吗

    ()

    预期的结果是,如果我将5个泰国字符从UTF-8格式转换为TIS620,字节计数应该从15(UTF-8)转换并保留为5(TIS620)

    Java的文本数据类型(
    String
    char
    character
    )-对于.NET、JavaScript、VB4/5/6/A/Script也是如此,…)始终使用Unicode字符集的UTF-16字符编码

    许多接口、绑定、驱动程序、数据适配器等等都理解文本数据类型是UTF-16,目标需要哪个字符编码,转换本身也是如此。只要使用Java数据类型,如果文本编码为UTF-8或TIS620,通常会使用字节数组

    它将直接文本作为文本

    现在,如果您有一个任意字节的数组,并且希望将其写入文本上下文,那么可以使用Base64。这样的函数接受一个字节数组并返回一个字符串(当然是UTF-16编码的)。但由于每个字符集都支持使用的字符,因此将数据转换为所需的字符编码不会丢失数据


    人们确实喜欢处理文本数据类型,所以上面的方案很好。但出于某种原因,有些人使用我称之为Base256的东西,而不是Base64。它们有一个字节数组(通常通过字符编码对文本进行编码创建),并应用编码函数将字节转换为文本,选择通过字符编码进行解码进行编码。您需要确定这是否是您正在处理的内容,如果是,则确定哪个字符编码被增选为Base256编码。(通常用于此目的的字符编码是ISO 8859-1。)

    Java中的
    字符串始终以UTF-16编码,不管它是如何构造的。或者换一种说法:一旦你有了
    字符串
    对象,你就不应该关心它有哪种编码。只有当您想返回到
    字节[]
    (或
    OutputStream
    等)时,编码才会返回到图片中

    这是正确的,几乎可以肯定,这正是您想要做的。你不应该试图回避这个事实

    如果需要将字符串写入磁盘或以某种特定编码将其发送到其他系统,则可以使用
    getBytes()
    string
    获取编码数据,就像在示例代码中一样

    换言之:

  • Java中的
    字符串
    对象不能“具有TIS620”编码。
    字节[]
    可以包含TIS620编码的数据,您可以使用
    .getBytes(“TIS620”)
    字符串创建该数据
  • 如果将编码的
    字节[]
    传递给另一个系统,它将具有正确的字节大小,因为它是使用正确的编码创建的
  • String
    始终使用UTF-16。使用内容创建
    字符串
    ”ใบใบใบใบ" 从UTF-8数据和TIS620数据将产生完全相同的字符串对象,无法知道创建它们使用了什么编码
  • InputStreamReader
    OutputStreamWriter
    和类似类也可以分别通过该编码进行解码/编码。除此之外,不需要特殊处理

  • @TomBlodget--您对此有什么意见吗?感谢Tom和Joachim Sauer的详细回复。因此字符串encodedString=new String(encodedBytes,“TIS620”);此构造函数的Javadoc表示,通过使用指定的字符集对指定的字节数组进行解码来构造一个新字符串。从上面的第3点开始,这是否意味着最终它的UTF-16已编码,并且没有保留TIS620?是的。但是,为什么您需要知道,在某个时刻,您有使用TIS620编码的文本的字节?如果您想要字节的话通过将文本编码为TIS620,您可以轻松地重新创建它。当我在Java字符串中使用泰语字符时,在UTF中它需要3个字节/字符,并增加总字节长度。我需要将字符串字符发送到传统后端系统(大型机)10个块中有10个字符串值。这个大型机只接受1字节/字符,所以如果我以英语形式传递所有字符,它没有问题,因为UTF将英语字符存储为1字节/字符,但现在它在接收泰国字符时失败。所以我的理解是,如果基础字符编码发生了变化,那么泰国字符可以作为1字节/字符传递,而TIS620则不会现在从上面的信息来看,这是不可能的:(.有办法吗?@apj:当然有可能:如果不先将“字符串”转换为
    byte[]
    ,就永远不会向另一个系统发送“字符串”,所以只要确保系统的任何部分都能将字符串对象转换为
    byte[]
    通过TIS620编码实现。当然,这只有在接收系统支持TIS620并且您可以告诉它您正在使用它*或者*根本不关心编码的情况下才会起作用(即,它只接受
    字节[]
    并将其传递给其他系统而不尝试解码)。
    public String encode() {
            try {
    String input = " "ใบใบใบใบ"";
                byte [] encodedBytes= input.getBytes("TIS620");
                String encodedString = new String(encodedBytes,"TIS620");
                }catch (UnsupportedEncodingException e){
                //Encoding failed           
            }
        }