From b5e1daf2183a7446eab544925a6cf61a1a3f4e9f Mon Sep 17 00:00:00 2001 From: okjackcaptain <378702538@qq.com> Date: Mon, 28 Nov 2022 14:53:04 +0800 Subject: [PATCH] =?UTF-8?q?-=20js=E7=9B=B8=E5=85=B3bug=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20(by=20okjack)=20-=20=E9=A2=84=E8=A7=88=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E5=85=A8=E5=B1=8F=E8=BF=94=E5=9B=9E=E5=90=8E=E7=9A=84=E7=84=A6?= =?UTF-8?q?=E7=82=B9=E9=A1=BA=E5=BA=8F=E9=97=AE=E9=A2=98=20(by=20okjack)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/github/tvbox/osc/js/DrpyMethods.java | 33 +++-------- .../tvbox/osc/ui/activity/DetailActivity.java | 7 +++ .../github/tvbox/osc/util/CharsetUtils.java | 57 +++++++++++++++++++ 3 files changed, 71 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/com/github/tvbox/osc/util/CharsetUtils.java diff --git a/app/src/main/java/com/github/tvbox/osc/js/DrpyMethods.java b/app/src/main/java/com/github/tvbox/osc/js/DrpyMethods.java index 8bf3eeb0..8620ea40 100644 --- a/app/src/main/java/com/github/tvbox/osc/js/DrpyMethods.java +++ b/app/src/main/java/com/github/tvbox/osc/js/DrpyMethods.java @@ -3,21 +3,12 @@ package com.github.tvbox.osc.js; import android.text.TextUtils; import android.util.Base64; import android.webkit.JavascriptInterface; - +import com.github.tvbox.osc.util.CharsetUtils; import com.github.tvbox.osc.util.Json; import com.github.tvbox.osc.util.OkGoHelper; -import com.github.tvbox.osc.util.UnicodeReader; import com.quickjs.JSArray; import com.quickjs.JSObject; - -import org.apache.commons.io.input.ReaderInputStream; import org.json.JSONObject; -import org.mozilla.universalchardet.UniversalDetector; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.io.Reader; import java.nio.charset.Charset; import java.util.List; import java.util.Map; @@ -99,23 +90,13 @@ public class DrpyMethods { } else if (isBuffer == 2) { result.set("content", Base64.encodeToString(response.body().bytes(), 0)); } else { - byte[] bytes = response.body().bytes(); - UniversalDetector detector = new UniversalDetector(null); - detector.handleData(bytes, 0, bytes.length); - detector.dataEnd(); - String encoding = detector.getDetectedCharset(); - encoding = encoding == null ? "UTF-8" : encoding; - String content = new String(bytes, encoding); - InputStream is = new ByteArrayInputStream(content.getBytes()); - Reader reader = new UnicodeReader(is); //处理有BOM头的utf8 - InputStream newInputStream = new ReaderInputStream(reader, Charset.defaultCharset()); - - ByteArrayOutputStream resultBs = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - for (int l; (l = newInputStream.read(buffer)) != -1; ) { - resultBs.write(buffer, 0, l); + String content = response.body().string(); + byte[] bytes = content.getBytes(); + Charset charset = CharsetUtils.detect(bytes); + if (!charset.name().toLowerCase().startsWith("utf")) { + content = new String(bytes, charset.name()); } - result.set("content", resultBs.toString("UTF-8")); + result.set("content", content); } return result; } catch (Exception e) { diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java index 2a1fa180..36098a37 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java @@ -435,10 +435,17 @@ public class DetailActivity extends BaseActivity { currentSeriesGroupView.isSelected(); } }); + mGridView.setOnFocusChangeListener((view, b) -> onGridViewFocusChange(view, b)); + setLoadSir(llLayout); } + private void onGridViewFocusChange(View view, boolean hasFocus) { + if (llPlayerFragmentContainerBlock.getVisibility() != View.VISIBLE) return; + llPlayerFragmentContainerBlock.setFocusable(!hasFocus); + } + private void initCheckedSourcesForSearch() { mCheckSources = SearchHelper.getSourcesForSearch(); } diff --git a/app/src/main/java/com/github/tvbox/osc/util/CharsetUtils.java b/app/src/main/java/com/github/tvbox/osc/util/CharsetUtils.java new file mode 100644 index 00000000..0fef0d33 --- /dev/null +++ b/app/src/main/java/com/github/tvbox/osc/util/CharsetUtils.java @@ -0,0 +1,57 @@ +package com.github.tvbox.osc.util; + +import java.nio.charset.Charset; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.mozilla.universalchardet.UniversalDetector; + +/** + * 字符集工具类,提供了检测字符集的工具方法 + * 首先当然是使用mozilla的开源工具包universalchardet进行字符集检测,对于检测失败的,使用中文常用字进行再次检测 + */ +public class CharsetUtils { + + /** + * 中文常用字符集 + */ + public static final String[] AVAILABLE_CHINESE_CHARSET_NAMES = new String[] { "GBK", "gb2312", "GB18030", "UTF-8", "Big5" }; + + /** + * 中文常用字 + */ + private static final Pattern CHINESE_COMMON_CHARACTER_PATTERN = Pattern.compile("的|一|是|了|我|不|人|在|他|有|这|个|上|们|来|到|时|大|地|为|子|中|你|说|生|国|年|着|就|那|和|要"); + + public static Charset detect(byte[] content) { + String charset = universalDetect(content); + if (charset != null && !charset.isEmpty()) { + return Charset.forName(charset); + } + + int longestMatch = 0; + for (String cs : AVAILABLE_CHINESE_CHARSET_NAMES) { + String temp = new String(content, Charset.forName(cs)); + Matcher matcher = CHINESE_COMMON_CHARACTER_PATTERN.matcher(temp); + + int count = 0; + while (matcher.find()) { + count += 1; + } + if (count > longestMatch) { + longestMatch = count; + charset = cs; + } + } + return charset == null ? Charset.forName("GB18030") : Charset.forName(charset); + } + + /** + * 使用mozilla的开源工具包universalchardet进行字符集检测,不一定能完全检测中文字符集 + */ + public static String universalDetect(byte[] content) { + UniversalDetector detector = new UniversalDetector(null); + detector.handleData(content, 0, content.length); + detector.dataEnd(); + return detector.getDetectedCharset(); + } +} \ No newline at end of file