2009-08-13 39 views
42

Tôi đang ở trong tình huống mà tôi cần giá trị ASCII của một ký tự (đối với Project Euler question #22, nếu bạn muốn cụ thể) và tôi đang chạy vào một vấn đề.Nhận mã ký tự ASCII trong Ruby bằng cách sử dụng `?` (Dấu chấm hỏi) không thành công

Là người mới đến hồng ngọc, tôi googled nó, và thấy rằng ? là con đường để đi: ?A hoặc bất cứ điều gì. Nhưng khi tôi kết hợp nó vào mã của tôi, kết quả của câu lệnh đó là chuỗi "A" —không có mã ký tự. Cùng một vấn đề với [0]slice(0), cả hai đều về mặt lý thuyết sẽ trả lại mã ASCII.

Điều duy nhất tôi có thể nghĩ là đây là vấn đề phiên bản Ruby. Tôi đang sử dụng phiên bản 1.9.1-p0, đã nâng cấp từ 1.8.6 chiều nay. Tôi lừa một chút từ một phiên bản làm việc của Ruby, trong cùng một thư mục, tôi nghĩ rằng có lẽ tôi đã có các tệp không đi kèm với tệp .zip, vì vậy tôi đã không tải xuống chúng.

Vậy tại sao tất cả mã ASCII của tôi lại được chuyển thành các ký tự thực tế?

Trả lời

62

Ruby trước 1.9 ký tự được xử lý hơi không nhất quán. ?a"a"[0] sẽ trả về một số nguyên đại diện cho giá trị ASCII của ký tự (thường không phải là hành vi mà mọi người đang tìm), nhưng trong các ký tự sử dụng thực tế thường được biểu diễn bằng một chuỗi ký tự một. Trong Ruby 1.9, các nhân vật không bao giờ biến thành các số nguyên một cách bí ẩn. Nếu bạn muốn nhận giá trị ASCII của một ký tự, bạn có thể sử dụng phương thức ord, như ?a.ord (trả về 97).

+0

Chỉ cần hoàn thành, phiên bản 1.9.3 hoặc mới hơn không cần '?' ký tên trước chữ cái, chúng ta có thể nhận được giá trị Integer chỉ với: a.ord – yat0

+3

@polska: Tôi nghĩ rằng bạn có thể đã hiểu lầm. Các ? biểu thị rằng chúng ta muốn ký tự 'a', do đó, viết '? a.ord' cho 97, trong khi chỉ đơn giản viết' a.ord' tìm kiếm một biến hoặc phương thức được gọi là 'a' và sẽ ném một NameError nếu không có gì với tên đó hoặc NoMethodError nếu biến 'a' không chứa một chuỗi. – Chuck

+1

vâng, bạn nói đúng .. Tôi đã hiểu lầm. Nó làm việc với? A.ord hoặc "a" .ord – yat0

7

Tìm thấy giải pháp. "string" .ord trả về mã ascii của s. Có vẻ như các phương pháp mà tôi đã tìm thấy bị hỏng trong chuỗi ruby ​​1.9.

+1

Tốt hơn là chỉnh sửa bài đăng gốc của bạn thay vì đăng câu trả lời riêng cho câu hỏi của riêng bạn. – pierrotlefou

+7

@pierr - Nhưng đây là câu trả lời cho câu hỏi, không chỉ là cập nhật câu hỏi – rampion

+5

Các phương pháp không bị hỏng. Ruby 1.9 định nghĩa hành vi của chúng một cách khác nhau, như Chuck đã giải thích. – Telemachus

10

Đối với 1,8 và 1,9

?a.class == String ? ?a.ord : ?a 

hoặc

"a".class == String ? "a".ord : "a"[0] 
+1

Lỗi cuối cùng này cho tôi trên 1.8.7: '>>" a ".class == String? "a" .ord: "a" [0] 'tạo lỗi ' NoMethodError: phương thức undefined \ 'ord 'cho" a ": String from (irb): 3' –

32

Làm thế nào về

"a"[0].ord 

cho 1,8/1,9 Portability.

-2

Nếu bạn đọc câu hỏi 22 từ dự án Euler một lần nữa bạn sẽ thấy bạn không tìm kiếm các giá trị ASCII của các ký tự. Những gì các câu hỏi được tìm kiếm, cho nhân vật "A" ví dụ là 1, vị trí của nó trong bảng chữ cái nơi như "A" có giá trị ASCII của 65.

+1

Chắc chắn bạn có thể lấy vị trí trong bảng chữ cái bằng cách trừ đi 64 từ giá trị ASCII của chữ hoa. Câu trả lời này phải là một bình luận. –

+0

@NilsLuxton, Có lẽ điều này phải là một nhận xét, nhưng đó là câu trả lời hay hơn cho câu hỏi thực tế mà họ đang tìm kiếm. Nếu bạn đọc câu hỏi Project Euler, giá trị ACSII không phải là những gì họ đang tìm kiếm. Không xứng đáng được bỏ phiếu xuống. – Schechter

+2

Câu hỏi đặt ra là "Làm thế nào để có được giá trị ASCII của một ký tự" không "Ai đó có thể làm rõ # 22 trong Project Euler". Việc đề cập đến vấn đề trong tầm tay chỉ là bối cảnh. Giải pháp của họ có thể tốt (và có khả năng) liên quan đến việc tìm kiếm giá trị ASCII đầu tiên và tính toán từ thời điểm đó. Tôi chắc chắn rằng OP đánh giá cao sự làm rõ của bạn, nhưng khi nó đứng, nó không phải là câu trả lời cho câu hỏi mà họ hỏi. Tôi có thể là một chút nghiêm ngặt về các quy tắc ở đây (và một S.Ooo noob), nhưng nếu câu trả lời này là một bình luận, nó sẽ nhận được một upvote từ tôi. –

4

Ruby Programming/ASCII

Trong phiên bản ruby ​​trước đó trước khi 1.9 , bạn có thể sử dụng cú pháp dấu chấm hỏi.

?a 

Sau 1.9, chúng tôi sử dụng thứ tự thay thế.

'a'.ord  
Các vấn đề liên quan