Java中奇怪的数字转换

时间:2014-03-20 20:48:08

标签: java

我正在测试某些内容并调用StringTokenizer并且正在进行一些奇怪的转换...忘记我应该在\中划分"\7767546"但我是只是好奇了\11到java中的\77

这是我的代码:

String path = "C:\\temp\\\\7800000\7767546.pdf";
String delimeter = "\\";
String[] values = new String[3];
int counter = 0;
StringTokenizer st = new StringTokenizer(path,delimeter); 
while(st.hasMoreTokens()){ 
           values[counter] = st.nextToken();
           System.out.println(" values[counter]" + values[counter]); 
           ++counter;
} 

这是输出:

values[counter]C:

values[counter]temp

values[counter]7800000?67546.pdf

如果您注意到,我原始字符串中的\77变为? .....就像unicode一样?

5 个答案:

答案 0 :(得分:7)

ASCII中的“77”是“?”。看来Java自动将int转换为char。

这是一个可能适合您的一般修复。它适用于许多不同的情况和许多不同的编程语言。您可以在77之前添加另一个“\”。最有可能的是,当Java处理代码时,双反斜杠将转换为单个反斜杠。

答案 1 :(得分:7)

正如Java语言规范所述

OctalEscape:
    \ OctalDigit
    \ OctalDigit OctalDigit
    \ ZeroToThree OctalDigit OctalDigit

OctalDigit: one of
    0 1 2 3 4 5 6 7

ZeroToThree: one of
    0 1 2 3

the following String or character literal is an octal escape

\77

在八进制中,值7763,即?个字符。

请注意,这与StringTokenizer 无关。它适用于您的String文字

"C:\\temp\\\\7800000\7767546.pdf"

如果您打印出来,将打印为

C:\temp\\7800000?67546.pdf

因为那是存储的值。

答案 2 :(得分:5)

在此字符串文字中:

String path = "C:\\temp\\\\7800000\7767546.pdf";

你忘了逃避最后\。实际发生的是:根据JLS 3.10.6,\可以跟随一个,两个或三个八进制数字,如果它后跟三个八进制数字,则第一个必须为0编译器将采用符合规则的最长子字符串。由于\776不遵循规则(第一个数字大于3),这意味着它将\77解释为转义序列,其中77被视为八进制数,等于63十进制,这是'?'的ASCII代码。

答案 3 :(得分:4)

"\77"octal escape sequence.它的十进制数63或'?'字符。

答案 4 :(得分:0)

感谢那些说它的八进制......那确实有意义......

我不知道java自动将这些类型的数字转换为八进制(0 \ 11到0 \ 77),我原本以为它会给我一个编译器错误,因为我没有正确划分我的\ ...我得到了一个编译错误,如果我的\后面的数字是8和9(即:0 \ 88和0 \ 99)

对于那些说我应该添加另一个\的人,我不确定你们是否看到我的免责声明说:"忘记了我应该在" \ 7767546&#中划定\的事实34;但是我只是好奇了什么是#11直到\ 77 in java"但同样感谢您的关注...