text_utils.py 685 B

123456789101112131415161718
  1. def full_to_half(text: str) -> str:
  2. """Convert full-width characters to half-width characters using code point manipulation.
  3. Args:
  4. text: String containing full-width characters
  5. Returns:
  6. String with full-width characters converted to half-width
  7. """
  8. result = []
  9. for char in text:
  10. code = ord(char)
  11. # Full-width letters and numbers (FF21-FF3A for A-Z, FF41-FF5A for a-z, FF10-FF19 for 0-9)
  12. if (0xFF21 <= code <= 0xFF3A) or (0xFF41 <= code <= 0xFF5A) or (0xFF10 <= code <= 0xFF19):
  13. result.append(chr(code - 0xFEE0)) # Shift to ASCII range
  14. else:
  15. result.append(char)
  16. return ''.join(result)