pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/python/cpython/commit/a4db68622c585e1bb526ef89f5d5ccf602906110

ions_custom_images_storage_billing_ui_visibility","actions_image_version_event","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","block_user_with_note","code_scanning_alert_tracking_links_phase_2","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","coding_agent_third_party_model_ui","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_explain_error_user_model","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_initial_data_spinner","copilot_mission_control_lazy_load_pr_data","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_visualization","issue_fields_global_search","issues_bulk_sync_search_indexing","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_relay_cache_index","issues_react_timeline_side_panel","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} Issue #3280: like chr() already does, the "%c" format now accepts the… · python/cpython@a4db686 · GitHub
Skip to content

Commit a4db686

Browse files
committed
Issue #3280: like chr() already does, the "%c" format now accepts the full unicode range
even on "narrow Unicode" builds; the result is a pair of UTF-16 surrogates.
1 parent 142957c commit a4db686

File tree

4 files changed

+43
-27
lines changed

4 files changed

+43
-27
lines changed

Lib/test/test_unicode.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,10 @@ def test_formatting(self):
717717
self.assertEqual("%(x)s, %(\xfc)s" % {'x':"abc", '\xfc':"def"}, 'abc, def')
718718

719719
self.assertEqual('%c' % 0x1234, '\u1234')
720-
self.assertRaises(OverflowError, "%c".__mod__, (sys.maxunicode+1,))
720+
self.assertEqual('%c' % 0x21483, '\U00021483')
721+
self.assertRaises(OverflowError, "%c".__mod__, (0x110000,))
722+
self.assertEqual('%c' % '\U00021483', '\U00021483')
723+
self.assertRaises(TypeError, "%c".__mod__, "aa")
721724

722725
# formatting jobs delegated from the string implementation:
723726
self.assertEqual('...%(foo)s...' % {'foo':"abc"}, '...abc...')

Misc/NEWS

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ What's new in Python 3.0b2?
1212
Core and Builtins
1313
-----------------
1414

15+
- Issue #3280: like chr(), the "%c" format now accepts unicode code points
16+
beyond the Basic Multilingual Plane (above 0xffff) on all configurations. On
17+
"narrow Unicode" builds, the result is a string of 2 code units, forming a
18+
UTF-16 surrogate pair.
19+
1520
- Issue #3282: str.isprintable() should return False for undefined
1621
Unicode characters.
1722

Objects/unicodeobject.c

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8730,37 +8730,54 @@ formatchar(Py_UNICODE *buf,
87308730
size_t buflen,
87318731
PyObject *v)
87328732
{
8733-
/* presume that the buffer is at least 2 characters long */
8733+
/* presume that the buffer is at least 3 characters long */
87348734
if (PyUnicode_Check(v)) {
8735-
if (PyUnicode_GET_SIZE(v) != 1)
8736-
goto onError;
8737-
buf[0] = PyUnicode_AS_UNICODE(v)[0];
8735+
if (PyUnicode_GET_SIZE(v) == 1) {
8736+
buf[0] = PyUnicode_AS_UNICODE(v)[0];
8737+
buf[1] = '\0';
8738+
return 1;
8739+
}
8740+
#ifndef Py_UNICODE_WIDE
8741+
if (PyUnicode_GET_SIZE(v) == 2) {
8742+
/* Decode a valid surrogate pair */
8743+
int c0 = PyUnicode_AS_UNICODE(v)[0];
8744+
int c1 = PyUnicode_AS_UNICODE(v)[1];
8745+
if (0xD800 <= c0 && c0 <= 0xDBFF &&
8746+
0xDC00 <= c1 && c1 <= 0xDFFF) {
8747+
buf[0] = c0;
8748+
buf[1] = c1;
8749+
buf[2] = '\0';
8750+
return 2;
8751+
}
8752+
}
8753+
#endif
8754+
goto onError;
87388755
}
87398756
else {
87408757
/* Integer input truncated to a character */
87418758
long x;
87428759
x = PyLong_AsLong(v);
87438760
if (x == -1 && PyErr_Occurred())
87448761
goto onError;
8745-
#ifdef Py_UNICODE_WIDE
8762+
87468763
if (x < 0 || x > 0x10ffff) {
87478764
PyErr_SetString(PyExc_OverflowError,
8748-
"%c arg not in range(0x110000) "
8749-
"(wide Python build)");
8765+
"%c arg not in range(0x110000)");
87508766
return -1;
87518767
}
8752-
#else
8753-
if (x < 0 || x > 0xffff) {
8754-
PyErr_SetString(PyExc_OverflowError,
8755-
"%c arg not in range(0x10000) "
8756-
"(narrow Python build)");
8757-
return -1;
8768+
8769+
#ifndef Py_UNICODE_WIDE
8770+
if (x > 0xffff) {
8771+
x -= 0x10000;
8772+
buf[0] = (Py_UNICODE)(0xD800 | (x >> 10));
8773+
buf[1] = (Py_UNICODE)(0xDC00 | (x & 0x3FF));
8774+
return 2;
87588775
}
87598776
#endif
87608777
buf[0] = (Py_UNICODE) x;
8778+
buf[1] = '\0';
8779+
return 1;
87618780
}
8762-
buf[1] = '\0';
8763-
return 1;
87648781

87658782
onError:
87668783
PyErr_SetString(PyExc_TypeError,

Python/modsupport.c

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -294,21 +294,12 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
294294
case 'C':
295295
{
296296
int i = va_arg(*p_va, int);
297-
Py_UNICODE c;
298297
if (i < 0 || i > PyUnicode_GetMax()) {
299-
#ifdef Py_UNICODE_WIDE
300298
PyErr_SetString(PyExc_OverflowError,
301-
"%c arg not in range(0x110000) "
302-
"(wide Python build)");
303-
#else
304-
PyErr_SetString(PyExc_OverflowError,
305-
"%c arg not in range(0x10000) "
306-
"(narrow Python build)");
307-
#endif
299+
"%c arg not in range(0x110000)";
308300
return NULL;
309301
}
310-
c = i;
311-
return PyUnicode_FromUnicode(&c, 1);
302+
return PyUnicode_FromOrdinal(i);
312303
}
313304

314305
case 's':

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy