@@ -96,13 +96,26 @@ pub fn from_utf8_with_null<'a>(vv: &'a [u8]) -> &'a str {
96
96
*
97
97
* Fails if invalid UTF-8
98
98
*/
99
- pub fn from_utf8_slice < ' a > ( vector : & ' a [ u8 ] ) -> & ' a str {
100
- unsafe {
101
- assert ! ( is_utf8( vector) ) ;
102
- let ( ptr, len) : ( * u8 , uint ) = :: cast:: transmute ( vector) ;
103
- let string: & ' a str = :: cast:: transmute ( ( ptr, len + 1 ) ) ;
104
- string
105
- }
99
+ pub fn from_utf8_slice < ' a > ( v : & ' a [ u8 ] ) -> & ' a str {
100
+ assert ! ( is_utf8( v) ) ;
101
+ unsafe { raw:: from_utf8_slice ( v) }
102
+ }
103
+
104
+ /**
105
+ * Convert a vector of bytes to a UTF-8 string.
106
+ * The vector needs to be one byte longer than the string, and end with a 0 byte.
107
+ *
108
+ * Compared to `from_utf8()`, this fn doesn't need to allocate a new owned str.
109
+ *
110
+ * # Failure
111
+ *
112
+ * Fails if not NULL terminated
113
+ * Fails if invalid UTF-8
114
+ */
115
+ pub fn from_utf8_slice_with_null < ' a > ( v : & ' a [ u8 ] ) -> & ' a str {
116
+ assert_eq ! ( v[ v. len( ) - 1 ] , 0 ) ;
117
+ assert ! ( is_utf8( v) ) ;
118
+ unsafe { raw:: from_utf8_slice_with_null ( v) }
106
119
}
107
120
108
121
/// Copy a slice into a new unique str
@@ -783,6 +796,20 @@ pub mod raw {
783
796
cast:: transmute ( v)
784
797
}
785
798
799
+ /// Converts a vector of bytes to a string slice.
800
+ /// The byte slice needs to contain valid utf8.
801
+ pub unsafe fn from_utf8_slice < ' a > ( v : & ' a [ u8 ] ) -> & ' a str {
802
+ let ( ptr, len) : ( * u8 , uint ) = :: cast:: transmute ( v) ;
803
+ cast:: transmute ( ( ptr, len + 1 ) )
804
+ }
805
+
806
+ /// Converts a vector of bytes to a string.
807
+ /// The byte slice needs to contain valid utf8 and needs to be one byte longer than
808
+ /// the string, if possible ending in a 0 byte.
809
+ pub unsafe fn from_utf8_slice_with_null < ' a > ( v : & ' a [ u8 ] ) -> & ' a str {
810
+ cast:: transmute ( v)
811
+ }
812
+
786
813
/// Converts a byte to a string.
787
814
pub unsafe fn from_byte ( u : u8 ) -> ~str { raw:: from_utf8 ( [ u] ) }
788
815
@@ -2850,6 +2877,108 @@ mod tests {
2850
2877
let _x = from_utf8_with_null(bb);
2851
2878
}
2852
2879
2880
+ #[test]
2881
+ fn test_unsafe_from_utf8_slice() {
2882
+ let a = [65u8, 65u8, 65u8, 65u8, 65u8, 65u8, 65u8];
2883
+ let b = unsafe { raw::from_utf8_slice(a) };
2884
+ assert_eq!(b, " AAAAAAA ");
2885
+ }
2886
+
2887
+ #[test]
2888
+ fn test_from_utf8_slice() {
2889
+ let ss = " ศไทย中华Việt Nam ";
2890
+ let bb = [0xe0_u8, 0xb8_u8, 0xa8_u8,
2891
+ 0xe0_u8, 0xb9_u8, 0x84_u8,
2892
+ 0xe0_u8, 0xb8_u8, 0x97_u8,
2893
+ 0xe0_u8, 0xb8_u8, 0xa2_u8,
2894
+ 0xe4_u8, 0xb8_u8, 0xad_u8,
2895
+ 0xe5_u8, 0x8d_u8, 0x8e_u8,
2896
+ 0x56_u8, 0x69_u8, 0xe1_u8,
2897
+ 0xbb_u8, 0x87_u8, 0x74_u8,
2898
+ 0x20_u8, 0x4e_u8, 0x61_u8,
2899
+ 0x6d_u8];
2900
+
2901
+ assert_eq!(ss, from_utf8_slice(bb));
2902
+ }
2903
+
2904
+ #[test]
2905
+ #[should_fail]
2906
+ #[ignore(cfg(windows))]
2907
+ fn test_from_utf8_slice_fail() {
2908
+ let bb = [0xff_u8, 0xb8_u8, 0xa8_u8,
2909
+ 0xe0_u8, 0xb9_u8, 0x84_u8,
2910
+ 0xe0_u8, 0xb8_u8, 0x97_u8,
2911
+ 0xe0_u8, 0xb8_u8, 0xa2_u8,
2912
+ 0xe4_u8, 0xb8_u8, 0xad_u8,
2913
+ 0xe5_u8, 0x8d_u8, 0x8e_u8,
2914
+ 0x56_u8, 0x69_u8, 0xe1_u8,
2915
+ 0xbb_u8, 0x87_u8, 0x74_u8,
2916
+ 0x20_u8, 0x4e_u8, 0x61_u8,
2917
+ 0x6d_u8];
2918
+
2919
+ let _x = from_utf8_slice(bb);
2920
+ }
2921
+
2922
+ #[test]
2923
+ fn test_unsafe_from_utf8_slice_with_null() {
2924
+ let a = [65u8, 65u8, 65u8, 65u8, 65u8, 65u8, 65u8, 0u8];
2925
+ let b = unsafe { raw::from_utf8_slice_with_null(a) };
2926
+ assert_eq!(b, " AAAAAAA ");
2927
+ }
2928
+
2929
+ #[test]
2930
+ fn test_from_utf8_slice_with_null() {
2931
+ let ss = " ศไทย中华Việt Nam ";
2932
+ let bb = [0xe0_u8, 0xb8_u8, 0xa8_u8,
2933
+ 0xe0_u8, 0xb9_u8, 0x84_u8,
2934
+ 0xe0_u8, 0xb8_u8, 0x97_u8,
2935
+ 0xe0_u8, 0xb8_u8, 0xa2_u8,
2936
+ 0xe4_u8, 0xb8_u8, 0xad_u8,
2937
+ 0xe5_u8, 0x8d_u8, 0x8e_u8,
2938
+ 0x56_u8, 0x69_u8, 0xe1_u8,
2939
+ 0xbb_u8, 0x87_u8, 0x74_u8,
2940
+ 0x20_u8, 0x4e_u8, 0x61_u8,
2941
+ 0x6d_u8, 0x0_u8];
2942
+
2943
+ assert_eq!(ss, from_utf8_slice_with_null(bb));
2944
+ }
2945
+
2946
+ #[test]
2947
+ #[should_fail]
2948
+ #[ignore(cfg(windows))]
2949
+ fn test_from_utf8_slice_with_null_fail() {
2950
+ let bb = [0xff_u8, 0xb8_u8, 0xa8_u8,
2951
+ 0xe0_u8, 0xb9_u8, 0x84_u8,
2952
+ 0xe0_u8, 0xb8_u8, 0x97_u8,
2953
+ 0xe0_u8, 0xb8_u8, 0xa2_u8,
2954
+ 0xe4_u8, 0xb8_u8, 0xad_u8,
2955
+ 0xe5_u8, 0x8d_u8, 0x8e_u8,
2956
+ 0x56_u8, 0x69_u8, 0xe1_u8,
2957
+ 0xbb_u8, 0x87_u8, 0x74_u8,
2958
+ 0x20_u8, 0x4e_u8, 0x61_u8,
2959
+ 0x6d_u8, 0x0_u8];
2960
+
2961
+ let _x = from_utf8_slice_with_null(bb);
2962
+ }
2963
+
2964
+ #[test]
2965
+ #[should_fail]
2966
+ #[ignore(cfg(windows))]
2967
+ fn test_from_utf8_slice_with_null_fail_2() {
2968
+ let bb = [0xff_u8, 0xb8_u8, 0xa8_u8,
2969
+ 0xe0_u8, 0xb9_u8, 0x84_u8,
2970
+ 0xe0_u8, 0xb8_u8, 0x97_u8,
2971
+ 0xe0_u8, 0xb8_u8, 0xa2_u8,
2972
+ 0xe4_u8, 0xb8_u8, 0xad_u8,
2973
+ 0xe5_u8, 0x8d_u8, 0x8e_u8,
2974
+ 0x56_u8, 0x69_u8, 0xe1_u8,
2975
+ 0xbb_u8, 0x87_u8, 0x74_u8,
2976
+ 0x20_u8, 0x4e_u8, 0x61_u8,
2977
+ 0x6d_u8, 0x60_u8];
2978
+
2979
+ let _x = from_utf8_slice_with_null(bb);
2980
+ }
2981
+
2853
2982
#[test]
2854
2983
fn test_from_buf() {
2855
2984
unsafe {
0 commit comments