2011-12-24 9 views
8

Tôi có một chuỗi mà tôi đang tạo và tôi cần thêm nhiều ký tự "\ 0" (null) vào chuỗi. Giữa mỗi ký tự null, là dữ liệu văn bản khác (chỉ các ký tự chữ và số ASCII).Có thể thêm dữ liệu vào chuỗi sau khi thêm " 0" (null) không?

Vấn đề của tôi là trong J2SE khi bạn thêm null đầu tiên (\ 0), java có vẻ như xác định rằng đó là một chuỗi terminator, (tương tự như C++), và bỏ qua tất cả các dữ liệu khác được nối thêm. Không có lỗi được nêu ra, dữ liệu theo sau chỉ bị bỏ qua. Tôi cần phải ép buộc dữ liệu dấu sau bổ sung sau khi một null trong chuỗi. Tôi phải làm điều này cho một cơ sở dữ liệu cũ mà tôi đang hỗ trợ.

Tôi đã cố gắng mã hóa/giải mã chuỗi với hy vọng rằng một cái gì đó như% 00 sẽ đánh lừa sự giải thích của hành vi chuỗi, nhưng khi tôi mã hóa lại chuỗi, Java sẽ thấy ký tự rỗng và xóa tất cả dữ liệu sau null đầu tiên.

Cập nhật: Dưới đây là đoạn mã có liên quan. Có, tôi đang cố gắng sử dụng Strings. Tôi dự định thử ký tự, nhưng tôi vẫn phải lưu nó vào cơ sở dữ liệu như một chuỗi, vì vậy tôi nghi ngờ rằng tôi sẽ kết thúc với cùng một vấn đề.

Một số nền. Tôi đang nhận dữ liệu qua bài đăng HTTP có "\ n". Tôi cần phải loại bỏ các dòng mới và thay thế chúng bằng "\ 0". Phương thức "debug" chỉ là một phương pháp đơn giản mà không System.out.println.

   String[] arrLines = sValue.split("\n"); 
       for(int k=0;k<arrLines.length;k++) { 
        if (0<k) { 
         sNewValue += "\0"; 
        } 
        sNewValue+= arrLines[k]; 
        debug("New value =" + sNewValue); 
       } 

sNewValue, một String, cam kết cơ sở dữ liệu và cần phải được thực hiện như một String. Những gì tôi quan sát khi tôi hiển thị giá trị hiện tại của sNewValue sau mỗi lần lặp trong giao diện điều khiển là một cái gì đó như thế này:

đầu vào là value1 \ nValue2 \ nValue3 Output trong giao diện điều khiển được đem lại cho tôi từ mã này

value1 
value1 
value1 

tôi hy vọng

value1 
value1 value2 
value1 value2 value3 

với null không thể in được giữa value1, value2 và value3 tương ứng. Lưu ý rằng giá trị thực sự được lưu lại vào cơ sở dữ liệu cũng chỉ là "value1". Vì vậy, nó không chỉ là một vấn đề hiển thị giao diện điều khiển. Dữ liệu sau \ 0 bị bỏ qua.

+0

Trong java, bạn không bao giờ có thể nói "nhân vật vô giá trị". Giá trị 'null' và Java không sử dụng ký tự ASCII thay vì sử dụng unicode. – Lion

+0

Bạn định làm gì với Chuỗi này khi bạn có? – Tom

+1

@Lion: Không đúng - ký tự 0 trong Unicode được gọi là ký tự rỗng. Xem http://www.unicode.org/charts/PDF/U0000.pdf –

Trả lời

12

I mạnh nghi ngờ việc này không liên quan gì đến văn bản trong chuỗi - tôi nghi ngờ nó chỉ là cách hiển thị văn bản. Ví dụ: hãy thử cách này:

public class Test { 
    public static void main(String[] args) { 
     String first = "first"; 
     String second = "second"; 
     String third = "third"; 
     String text = first + "\0" + second + "\0" + third; 
     System.out.println(text.length()); // Prints 18 
    } 
} 

Điều này in 18, cho thấy tất cả các ký tự đều có mặt. Tuy nhiên, nếu bạn cố gắng hiển thị text trong nhãn giao diện người dùng, tôi sẽ không ngạc nhiên khi chỉ thấy first. (Điều này cũng có thể đúng trong gỡ rối khá yếu.)

Tương tự như vậy bạn sẽ có thể sử dụng:

char c = text.charAt(7); 

Và bây giờ c nên 'e' đó là lá thư thứ hai của "thứ hai".

Về cơ bản, tôi mong đợi cốt lõi của Java không quan tâm chút nào về thực tế là nó chứa U + 0000. Nó chỉ là một nhân vật khác như xa như Java là có liên quan. Nó chỉ ở ranh giới với mã gốc (ví dụ: hiển thị) có thể gây ra sự cố.

Nếu điều này không hữu ích, vui lòng giải thích chính xác những gì bạn đã quan sát - điều gì khiến bạn nghĩ phần còn lại của dữ liệu không được thêm vào.

EDIT: Một cách tiếp cận chẩn đoán là để in ra giá trị Unicode của mỗi nhân vật trong chuỗi:

for (int i = 0; i < text.length(); i++) { 
    System.out.println((int) text.charAt(i)); 
} 
+2

Tương tự như vậy, nếu bạn viết nó vào cơ sở dữ liệu với PreparedStatement.setString(), tôi không chắc cơ sở dữ liệu sẽ làm gì. Có thể nó an toàn hơn với setBytes() hoặc setBlob(). – greyfairer

+1

@greyfairer: Không nếu kiểu trường cơ sở dữ liệu là 'varchar' hoặc một cái gì đó tương tự, IMO. –

+0

Cốt lõi của vấn đề dường như là hành vi của lớp String và những gì nó làm khi nó thấy "\ 0". – giulio

2

Tôi khuyên bạn nên sử dụng một số char[] hoặc List<Char> vì có vẻ như bạn không thực sự sử dụng String như vậy (một Chuỗi thực thường không chứa null hoặc các ký tự không thể in khác).

+0

-1: Một "chuỗi thực" có thể chứa các ký tự null không có vấn đề gì. Nó chỉ là một nhân vật khác như xa như Java là có liên quan. –

+0

@Jon về mặt kỹ thuật có, nhưng nó không phải là một ý tưởng tuyệt vời – artbristol

+2

Tại sao không? Nếu OP muốn đại diện cho một chuỗi như vậy cho một reaason hợp lệ, và không có lý do kỹ thuật nó không nên làm việc, tại sao tránh nó? Điều này nghe có vẻ giống như một vấn đề hiển thị nhiều hơn bất cứ điều gì khác. –

1

Hành vi tương tự cho lớp học StringBuffer?

Vì "\ 0" gây ra một số sự cố, tôi khuyên bạn không nên sử dụng nó. Tôi sẽ cố gắng thay thế một số dấu phân cách tốt hơn bằng "\ 0" khi thực sự viết chuỗi đó vào DB của bạn.

1

Điều này là do \ là một ký tự thoát trong Java (như trong nhiều ngôn ngữ liên quan đến C) và bạn cần phải thoát khỏi nó bằng cách sử dụng thêm \ như sau.

String str="\\0Java language"; 
System.out.println(str); 

và bạn sẽ có thể hiển thị \ 0Java ngôn ngữ trên console.

+0

''\'' không phải là cụm từ thông dụng. Nó chỉ là một ký tự thoát trong chuỗi ký tự. –

+0

OP không muốn dấu gạch chéo ngược theo sau là số không trong chuỗi - anh ta muốn ký tự null Unicode, U + 0000. –

+0

oh Tôi đã hiểu sai. – Lion