最近在Http请求时,出现了Caused by: java.nio.charset.UnsupportedCharsetException: The unsupported charset name is "GB18030".
不支持GB18030
会出现这种问题,是由于我采用了EntityUtils.toString方法来解析回传数据。那么在这里会涉及到charset。
那么,先来看看如何取得response中的charset
HttpEntity entity = httpResponse.getEntity(); Header header = entity.getContentType(); if (header != null) { HeaderElement[] elements = header.getElements(); if (elements.length > 0) { String name = elements[0].getName(); String charset = null; NameValuePair param = elements[0] .getParameterByName("charset"); if (param != null) { charset = param.getValue(); } Charset c = (charset != null && charset.length() > 0) ? Charset .forName(charset) : null; System.out.println(c.name()); } }
再来看看charset说明中,其所支持的:The following charsets should be supported by any java platform: US-ASCII, ISO-8859-1, UTF-8, utf-8BE, utf-8LE, utf-8.
所以,如果返回来的是GB18030,自然就不支持了
解决的方法:
用下面这个方法代替EntityUtils.toString
public Object handleEntity(HttpEntity entity, String charset) throws IOException { if (entity == null) return null; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; long count = entity.getContentLength(); long curCount = 0; int len = -1; InputStream is = entity.getContent(); while ((len = is.read(buffer)) != -1) { outStream.write(buffer, 0, len); curCount += len; } byte[] data = outStream.toByteArray(); outStream.close(); is.close(); return new String(data, charset); }
采集音视频实时264编码和aac编码 经常有人做视频的监控或者流媒体的实时传输,其中就会有包括音频以及视频的采集、编码、传输等过程,对于实时性的应用就需要将采集得到的每一帧进行实时的编码输出。 这里我使用了directshow来采集音频和视频,当然使用directshow也有一定得问题就是它不能跨平台,对于跨平台的可以使用opencv采集视频,openal采集音频;对于编码部分,使用264编码器进行视频编码,faac编码器进行音频编码,最后将编码的文件保存在本地文件夹。 现手上有完整的工程代码,有需要的朋友可以联系qq:819853294,一起交流
(1) 示例。BSP的.bat文件
set BSP_SMDK2443=1
set BSP_SMDK2450=2
set BSP_TYPE=%BSP_SMDK2450%
if /i "%BSP_IMAGE_TYPE%"=="1" set IMGMULTIBIN=1 else set IMGMULTIBIN=
if /i not "%BSP_NOSDK%"=="1" call %_TARGETPLATROOT%\src\sdk\sdk.bat
(2) 修改。
如上面的示例做相应的产品名称定义。如果需要在BSP的c,c++等files里面能直接引用上面的宏,需要在BSP的根目录下面的sources.cmn文件进行转换一下,成为c可以调用的格式。如下所示,每使用一个宏,需要定义两行:
ADEFINES=$(ADEFINES) –pd “BSP_SMDK2443 SETA $(BSP_SMDK2443)”
CDEFINES=$(CDEFINES) –DBSP_SMDK2443=$(BSP_SMDK2443)
ADEFINES=$(ADEFINES) –pd “BSP_SMDK2450 SETA $(BSP_SMDK2450)”
CDEFINES=$(CDEFINES) –DBSP_SMDK2450=$(BSP_SMDK2450)
ADEFINES=$(ADEFINES) –pd “BSP_TYPE SETA $(BSP_ TYPE)”
CDEFINES=$(CDEFINES) –DBSP_ TYPE=$(BSP_ TYPE)
(3) 引用。
#if (BSP_TYPE==BSP_SMDK2443)
#elif(BSP_TYPE==BSP_SMDK2450)
#endif