GVKun编程网logo

特殊字符问题:MQ消息PUT错误:java.nio.charset.UnmappableCharacterException(java mq消息队列详解)

27

本文将带您了解关于特殊字符问题:MQ消息PUT错误:java.nio.charset.UnmappableCharacterException的新内容,同时我们还将为您解释javamq消息队列详解的相

本文将带您了解关于特殊字符问题:MQ消息PUT错误:java.nio.charset.UnmappableCharacterException的新内容,同时我们还将为您解释java mq消息队列详解的相关知识,另外,我们还将为您提供关于: Code:[HdfsReader-03], Description:[值错误]. - 不支持的编码格式 : [1] - java.nio.charset.UnsupportedCharsetException: 1、Apache Hive:失败:ParseException line 4:1 character ' 此处不支持、Caused by: java.nio.charset.MalformedInputException: Input length = 1、Caused by: java.nio.charset.MalformedInputException: Input length = 2的实用信息。

本文目录一览:

特殊字符问题:MQ消息PUT错误:java.nio.charset.UnmappableCharacterException(java mq消息队列详解)

特殊字符问题:MQ消息PUT错误:java.nio.charset.UnmappableCharacterException(java mq消息队列详解)

在本地连接到队列管理器(即使用TRANSPORT_MQSERIES_BINDINGS)时,则代码:-

m.characterSet     = MQC.MQCCSI_Q_MGR;

表示“采用在队列管理器属性CCSID中设置的CCSID”。您可以使用以下MQSC命令查看此属性:-

DISPLAY QMGR CCSID

以客户端身份连接时(如您的代码所示),则代码:-

m.characterSet     = MQC.MQCCSI_Q_MGR;

表示“从客户端计算机的语言环境中找到CCSID”。

IBM Knowledge Center指出:-

对于客户端应用程序,根据客户端的语言环境而不是队列管理器上的语言环境来填充MQCCSI_Q_MGR

如果更改代码行以将消息CCSID显式设置为1208可以解决此问题,则似乎您的客户端计算机的语言环境未设置为UTF-8。

通过浏览队列中的消息(不进行转换)并查看MQMD.CodedCharSetId字段中的内容,可以查看客户端设置的内容。

,

之所以在MQ v7.5而不是MQ v9.0上起作用,是因为在IBM MQ v8.0之前,使用java.nio.charset.Charset.encode(CharBuffer)的Java编码数据的IBM MQ类导致默认替换为格式错误或不可翻译的数据。由于默认的characterSet为819(ASCII),因此,您发送的任何无法转换为ASCII的字符都将被默认替换字符透明替换,在大多数情况下,这意味着数据已被替换为?个字符。

v8.0之后,默认行为更改为将这种情况报告为错误,并且默认情况下不再替换格式错误或不可翻译的数据。


您将字符集设置为UTF-8的解决方案是最好的解决方案,因为这会导致发送要发送的确切数据。

另一个选择是告诉MQ使用先前的行为。


IBM MQ 9.0知识中心页面Developing applications>Developing JMS and Java applications>Using IBM MQ classes for Java>Character string conversions in IBM MQ classes for Java中描述了有关新行为的描述以及如何配置Java的IBM MQ类以使用先前的行为:

从IBM®MQ版本8.0开始,有关以下内容的一些缺省行为 Java MQ的IBM MQ类中的字符串转换具有 改变了。

在IBM MQ版本8.0之前,IBM MQ类中的字符串转换用于 Java是通过调用 java.nio.charset.Charset.decode(ByteBuffer)和 Charset.encode(CharBuffer)方法。

使用这两种方法都会默认替换( 替换)格式错误或不可翻译的数据。

此行为可以掩盖应用程序中的错误,并导致 转换数据中的意外字符,例如?。从IBM MQ 8.0版,为了更早,更有效地检测到此类问题, Java的IBM MQ类使用CharsetEncoders和CharsetDecoders 直接并配置格式错误和不可翻译的处理 数据。

从IBM MQ版本8.0开始,默认行为是报告此类问题 通过抛出适当的MQException。

...

设置系统默认值 -

从IBM MQ版本8.0开始,以下两个Java系统属性是: 可用于配置有关字符串的默认行为 转换。

com.ibm.mq.cfg.jmqi.UnmappableCharacterAction 指定在编码和解码时对不可翻译数据采取的操作。 该值可以是REPORT,REPLACE或IGNORE。

com.ibm.mq.cfg.jmqi.UnmappableCharacterReplacement 设置或获取无法映射字符时要应用的替换字节 编码操作中使用默认的Java替换字符串 在解码操作中。

为了避免Java字符和本机字节之间的混淆 表示形式,您应指定 com.ibm.mq.cfg.jmqi.UnmappableCharacterReplacement作为十进制数字 代表本机字符集中的替换字节。

例如,如果本机字节?的十进制值是本机字节,则为63。 本机字符集是基于ASCII的,例如ISO-8859-1。 如果本机字符集是EBCDIC,则为111。


如果您想模仿以前的行为,则可以设置以下系统属性:

-Dcom.ibm.mq.cfg.jmqi.UnmappableCharacterAction=REPLACE
-Dcom.ibm.mq.cfg.jmqi.UnmappableCharacterReplacement=63

您也可以使用以下方式通过程序进行设置:

System.setProperty("com.ibm.mq.cfg.jmqi.UnmappableCharacterAction","REPLACE");
System.setProperty("com.ibm.mq.cfg.jmqi.UnmappableCharacterReplacement","63");

: Code:[HdfsReader-03], Description:[值错误].  - 不支持的编码格式 : [1] - java.nio.charset.UnsupportedCharsetException: 1

: Code:[HdfsReader-03], Description:[值错误]. - 不支持的编码格式 : [1] - java.nio.charset.UnsupportedCharsetException: 1

 ERROR JobContainer - Exception when job run
com.alibaba.datax.common.exception.DataXException: Code:[HdfsReader-03], Description:[值错误].  - 不支持的编码格式 : [1] - java.nio.charset.UnsupportedCharsetException: 1
    at java.nio.charset.Charset.forName(Charset.java:531)
    at org.apache.commons.io.Charsets.toCharset(Charsets.java:80)
    at com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader$Job.validate(HdfsReader.java:93)
    at com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader$Job.init(HdfsReader.java:50)
    at com.alibaba.datax.core.job.JobContainer.initJobReader(JobContainer.java:673)
    at com.alibaba.datax.core.job.JobContainer.init(JobContainer.java:303)
    at com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113)
    at com.alibaba.datax.core.Engine.start(Engine.java:92)
    at com.alibaba.datax.core.Engine.entry(Engine.java:171)
    at com.alibaba.datax.core.Engine.main(Engine.java:204)

    at com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:33) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
    at com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader$Job.validate(HdfsReader.java:95) ~[hdfsreader-0.0.1-SNAPSHOT.jar:na]
    at com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader$Job.init(HdfsReader.java:50) ~[hdfsreader-0.0.1-SNAPSHOT.jar:na]
    at com.alibaba.datax.core.job.JobContainer.initJobReader(JobContainer.java:673) ~[datax-core-0.0.1-SNAPSHOT.jar:na]
    at com.alibaba.datax.core.job.JobContainer.init(JobContainer.java:303) ~[datax-core-0.0.1-SNAPSHOT.jar:na]
    at com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113) ~[datax-core-0.0.1-SNAPSHOT.jar:na]
    at com.alibaba.datax.core.Engine.start(Engine.java:92) [datax-core-0.0.1-SNAPSHOT.jar:na]
    at com.alibaba.datax.core.Engine.entry(Engine.java:171) [datax-core-0.0.1-SNAPSHOT.jar:na]
    at com.alibaba.datax.core.Engine.main(Engine.java:204) [datax-core-0.0.1-SNAPSHOT.jar:na]
Caused by: java.nio.charset.UnsupportedCharsetException: 1
    at java.nio.charset.Charset.forName(Charset.java:531) ~[na:1.8.0_191]
    at org.apache.commons.io.Charsets.toCharset(Charsets.java:80) ~[commons-io-2.4.jar:2.4]
    at com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader$Job.validate(HdfsReader.java:93) ~[hdfsreader-0.0.1-SNAPSHOT.jar:na]
    ... 7 common frames omitted
2019-09-17 15:54:29.892 [job-0] INFO  StandAloneJobContainerCommunicator - Total 0 records, 0 bytes | Speed 0B/s, 0 records/s | Error 0 records, 0 bytes |  All Task WaitWriterTime 0.000s |  All Task WaitReaderTime 0.000s | Percentage 0.00%
2019-09-17 15:54:29.893 [job-0] ERROR Engine - 

经 DataX 智能分析,该任务最可能的错误原因是:
com.alibaba.datax.common.exception.DataXException: Code:[HdfsReader-03], Description:[值错误].  - 不支持的编码格式 : [1] - java.nio.charset.UnsupportedCharsetException: 1
    at java.nio.charset.Charset.forName(Charset.java:531)
    at org.apache.commons.io.Charsets.toCharset(Charsets.java:80)
    at com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader$Job.validate(HdfsReader.java:93)
    at com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader$Job.init(HdfsReader.java:50)
    at com.alibaba.datax.core.job.JobContainer.initJobReader(JobContainer.java:673)
    at com.alibaba.datax.core.job.JobContainer.init(JobContainer.java:303)
    at com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113)
    at com.alibaba.datax.core.Engine.start(Engine.java:92)
    at com.alibaba.datax.core.Engine.entry(Engine.java:171)
    at com.alibaba.datax.core.Engine.main(Engine.java:204)

    at com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:33)
    at com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader$Job.validate(HdfsReader.java:95)
    at com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader$Job.init(HdfsReader.java:50)
    at com.alibaba.datax.core.job.JobContainer.initJobReader(JobContainer.java:673)
    at com.alibaba.datax.core.job.JobContainer.init(JobContainer.java:303)
    at com.alibaba.datax.core.job.JobContainer.start(JobContainer.java:113)
    at com.alibaba.datax.core.Engine.start(Engine.java:92)
    at com.alibaba.datax.core.Engine.entry(Engine.java:171)
    at com.alibaba.datax.core.Engine.main(Engine.java:204)
Caused by: java.nio.charset.UnsupportedCharsetException: 1
    at java.nio.charset.Charset.forName(Charset.java:531)
    at org.apache.commons.io.Charsets.toCharset(Charsets.java:80)
    at com.alibaba.datax.plugin.reader.hdfsreader.HdfsReader$Job.validate(HdfsReader.java:93)
    ... 7 more
 

Apache Hive:失败:ParseException line 4:1 character ' 此处不支持

Apache Hive:失败:ParseException line 4:1 character ' 此处不支持

尝试删除新行?

CREATE SCHEMA IF NOT EXISTS practica2;

CREATE EXTERNAL TABLE IF NOT EXISTS practica2.station_data (IDPROVINCIA string,SPROVINCIA string,IDESTACION string,SESTACION string,FECHA string,DIA string,TEMPMAX string,HORMINTEMPMAX string,TEMPMIN string,HORMINTEMPMIN string,TEMPMEDIA string,HUMEDADMAX string,HUMEDADMIN string,HUMEDADMEDIA string,VELVIENTO string,DIRVIENTO string,RADIACION string,PRECIPITACION string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ';'
STORED AS TEXTFILE
LOCATION 'hdfs://0.0.0.0:9000/user/hive';

或者您的 sql 文件中可能有全角空间。见this post。如果你想去掉全角空格,手动输入sql文件,避免从其他地方复制/粘贴。

Caused by: java.nio.charset.MalformedInputException: Input length = 1

Caused by: java.nio.charset.MalformedInputException: Input length = 1

java.lang.IllegalStateException: Failed to load property source from location ''classpath:/application.yml''
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadIntoGroup(ConfigFileApplicationListener.java:476)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:465)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:386)
    at org.springframework.boot.context.config.ConfigFileApplicationListener.addPropertySources(ConfigFileApplicationListener.java:225)
    at org.springframework.boot.context.config.ConfigFileApplicationListener.postProcessEnvironment(ConfigFileApplicationListener.java:195)
    at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:182)
    at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:168)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:122)
    at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:74)
    at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
    at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:325)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:296)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
    at com.chinanums.schoolspayment.SchoolspaymentApplication.main(SchoolspaymentApplication.java:10)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
    at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:254)
    at org.yaml.snakeyaml.reader.StreamReader.<init>(StreamReader.java:58)
    at org.yaml.snakeyaml.Yaml.loadAll(Yaml.java:518)
    at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:157)
    at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:135)
    at org.springframework.boot.env.YamlPropertySourceLoader$Processor.process(YamlPropertySourceLoader.java:101)
    at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:58)
    at org.springframework.boot.env.PropertySourcesLoader.load(PropertySourcesLoader.java:128)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.doLoadIntoGroup(ConfigFileApplicationListener.java:490)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadIntoGroup(ConfigFileApplicationListener.java:473)
    ... 22 common frames omitted
Caused by: java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at org.yaml.snakeyaml.reader.UnicodeReader.read(UnicodeReader.java:125)
    at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:223)
    ... 31 common frames omitted

第一种可能是你的application.yml文件编码格式有问题,改为UTF-8,如下:

 

 第二种:

可能就是你的application.yml文件是通过把其他类型的文件后缀名直接改为yml生成的,这时就需要你把application.yml中的内容全部复制,然后删除,再新建一个application.yml文件,

将复制的内容拷贝进去再运行项目就不会报错了。

Caused by: java.nio.charset.MalformedInputException: Input length = 2

Caused by: java.nio.charset.MalformedInputException: Input length = 2

java.nio.charset.MalformedInputException: Input length = 2 异常表示输入数据的长度不正确,导致字符集解析失败。

MalformedInputException 是 Java NIO(New I/O)中的一个异常类,它通常在字符集编解码时出现问题时抛出。在你的情况下,输入数据的长度为2,可能与所使用的字符集或编码方式不匹配。

要解决这个异常,你可以考虑以下几个方面:

  1. 确认输入数据的编码方式:检查你的代码中用于读取输入数据的部分,并确认所使用的字符集是否正确。如果你知道输入数据的编码方式,可以使用相应的字符集进行解码。

    例如,如果输入数据的编码为 UTF-8,你可以使用以下方式进行解码:

Charset charset = StandardCharsets.UTF_8;
String decodedString = new String(inputBytes, charset);

 

  1. 如果不确定输入数据的编码方式,可以尝试使用不同的字符集进行解码,观察是否能够成功解析数据。

  2. 处理输入数据长度不正确的情况:如果输入数据的长度确实不正确,你可能需要检查数据源或数据传输过程中是否存在问题。确保输入数据的长度和内容与预期一致,以避免解码时出现异常。

    另外,还可以尝试使用更为健壮的解码方式,如使用 CharsetDecoder 类进行逐个字符的解码,从而更灵活地处理输入数据的异常情况。

 

    public static void main(String[] args) {
        byte[] inputBytes = new byte[] { 1, 2, 3, 4, 5 };

        Charset charset = StandardCharsets.UTF_8;
        ByteBuffer inputBuffer = ByteBuffer.wrap(inputBytes);
        CharBuffer outputBuffer = CharBuffer.allocate(inputBytes.length);
        CharsetDecoder decoder = charset.newDecoder();
        decoder.onMalformedInput(CodingErrorAction.IGNORE); // 忽略输入长度不正确的情况
        decoder.decode(inputBuffer, outputBuffer, true);
        decoder.flush(outputBuffer);
        outputBuffer.flip();
        String decodedString = outputBuffer.toString();
        System.out.println("decodedString = " + decodedString);
    }

 

  1. 考虑数据源的可靠性:如果你的输入数据来自外部源(如网络、文件、数据库等),确保源数据的完整性和正确性。在一些情况下,输入数据的损坏或错误可能导致解码异常。

    可以使用校验和或其他方法验证输入数据的完整性,并确保数据的准确性和一致性。

根据具体情况选择适当的字符集和解码方式,确保输入数据的正确解析。

 

关于特殊字符问题:MQ消息PUT错误:java.nio.charset.UnmappableCharacterExceptionjava mq消息队列详解的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于: Code:[HdfsReader-03], Description:[值错误]. - 不支持的编码格式 : [1] - java.nio.charset.UnsupportedCharsetException: 1、Apache Hive:失败:ParseException line 4:1 character ' 此处不支持、Caused by: java.nio.charset.MalformedInputException: Input length = 1、Caused by: java.nio.charset.MalformedInputException: Input length = 2的相关知识,请在本站寻找。

本文标签: