【问题标题】:Why do I get question marks instead of symbols when reading from .txt with InputStream?为什么使用 InputStream 从 .txt 读取时得到问号而不是符号?
【发布时间】:2012-05-11 17:20:08
【问题描述】:

我知道这一定很明显,但找不到答案。

我应该怎么做才能获得正确的字符,例如“,'等......?

这是我正在使用的方法,

public void read(Context context) {

        InputStream inputStream = context.getResources().openRawResource(
                R.raw.puzzles);
        Scanner scanner = new Scanner(inputStream);
        scanner.useDelimiter(PATTERN);
        for (int i = 0; i < 70; i++) {
            ids[i] = scanner.next();
            titles[i] = scanner.next();
            questions[i] = scanner.next();
            answers[i] = scanner.next();
        }

    }

谢谢

【问题讨论】:

    标签: android character inputstream


    【解决方案1】:

    经过几天的研究,我终于找到了答案。

    首先,我从 InputStream 创建了一个 BufferedReader 用于字符读取而不是原始字节读取。

    最重要的是,我使用带有 charSetName 的构造函数实例化了 InputStream。

    如果您在记事本中转到“另存为”,则可以选择您的编码。

    终于找到here支持的编码了。

    记事本中默认的似乎是ANSI,似乎不支持,所以我更改了它并将我的.txt文件保存为UTF8。

    代码如下:

    public void read(Context context) {
    
            InputStream inputStream = context.getResources().openRawResource(
                    R.raw.puzzles);
    
            BufferedReader bufferedReader = null;
            try {
                bufferedReader = new BufferedReader(new InputStreamReader(
                        inputStream, "UTF8"));
            } catch (UnsupportedEncodingException e1) {
                e1.printStackTrace();
            }
    
            Puzzle p = null;
    
            Scanner scanner = new Scanner(bufferedReader);
            scanner.useDelimiter(TOKEN);
            // Skips the first strange char
            scanner.next();
            while (scanner.hasNext()) {
    
                p = new Puzzle();
                p.setId(scanner.next());
                p.setTitle(scanner.next());
                p.setQuestion(scanner.next());
                p.setAnswer(scanner.next());
                puzzles.add(p);
            }
    
        }
    

    【讨论】:

      【解决方案2】:

      默认情况下,Scanner 对象似乎只识别字母和数字...尝试不使用扫描仪的方法,例如此问题的答案:Android read text raw resource file

      并使用 String.indexOf() 或 TextUtils.StringSplitter 或任何类似的东西来读取每一行并解析令牌之间的真实字符串。

      您可能希望使用 while 循环来读取数据,直到文件末尾,而不是使用固定数字(在您的情况下为 70)来处理可能包含更多或更少数据的未来拼图文件。

      【讨论】:

      • 谢谢@Sam,我肯定会采用一种方法来读取您链接上所说的字节字符,但仍然不明白为什么我不能使用扫描仪。你在哪里读到它只识别字母和数字?关于循环,你是绝对正确的。我只是不知道如何使用 Scanner 类。谢谢
      • 老实说,您的代码和扫描仪文档没有给出您不阅读符号的任何明确原因,所以我认为您没有编造,同意您的看法,并提供了一个可行的选择。 :) 当我自己使用另一种方法时,我不想深入研究原因。
      • 仍然无法使用 BufferedReader readLine() 方法获得正确的符号。有什么建议吗?
      【解决方案3】:

      尝试使用Scanner 的实例,在其中传入字符集,即 new Scanner (InputStream src, String charsetName)

      HTH

      【讨论】:

      • 嗨@Devunwired,我已经尝试过使用utf-8,但仍然得到相同的结果。我应该尝试什么字符集?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 2011-09-08
      • 2015-12-27
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多